欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

栈的链式存储结构

程序员文章站 2022-06-05 14:53:40
...

栈的链式存储结构直接会用到线性表的链式存储结构的代码:

LinkListApi.h和LinkListApi.cpp具体参考我之前的文章 线性表的链式存储(业务结点和链表算法分离模式)

这里直接上代码:

linkstack.h如下:

#ifndef _MY_LINKSTACK_H_
#define _MY_LINKSTACK_H_

typedef void LinkStack;
typedef void LinkStackNode;

LinkStack* LinkStack_Create();

void LinkStack_Destroy(LinkStack* stack);

void LinkStack_Clear(LinkStack* stack);

//下面三个需要单独处理
//start
//在最前一个位置插入 与顺序存储不同,链式存储以第一个结点模拟栈顶
int LinkStack_Push(LinkStack* stack, void* item);
//在最前一个位置删除
void* LinkStack_Pop(LinkStack* stack);
//获取最前一个位置元素
void* LinkStack_Top(LinkStack* stack);
//end


int LinkStack_Size(LinkStack* stack);

#endif //_MY_LINKSTACK_H_

linkstack.cpp 代码如下:

#include<iostream>
#include"linkstack.h"
//需要用到线性表的链式存储代码
#include"LinkListApi.h"
struct linkstack
{
	LinkListNode Node;
	void * item;
};

LinkStack* LinkStack_Create()
{
	return LinkList_Create();
}
void LinkStack_Destroy(LinkStack* stack)
{
	LinkStack_Clear(stack);
	LinkList_Destroy(stack);
}
void LinkStack_Clear(LinkStack* stack)
{
	while (LinkList_Length(stack) > 0)
	{
		LinkStack_Pop(stack);
	}
	LinkList_Clear(stack);
	return;
}
int LinkStack_Size(LinkStack* stack)
{
	return LinkList_Length(stack);
}

//开始有点变化了
int LinkStack_Push(LinkStack* stack, void* item)
{
	//我们是在使用线性表的链式存储的api,所以我们要封装一个api接口
	 void* item 栈结点  ===>链表结点
	linkstack *tmp = (linkstack *)malloc(sizeof(linkstack));
	tmp->item = item;
	//向最后一个位置插入个元素
	int ret=LinkList_Insert(stack, (LinkListNode*)tmp,0);
	if (ret != 0)//对于处理失败,要做负责的人进行释放内存空间
	{
		free(tmp);
		return ret;
	}
	return ret;
}
void* LinkStack_Pop(LinkStack* stack)
{
	linkstack *tmp = (linkstack *)LinkList_Delete(stack, 0);
	if (tmp == NULL)
	{
		printf("err:LinkStack_Pop\n");
		return NULL;
	}
	//把链表节点 ====>转换成  栈结点
	void *p = tmp->item;
	free(tmp);
	return p;
}

void* LinkStack_Top(LinkStack* stack)
{
	linkstack *tmp = (linkstack *)LinkList_Get(stack,0);
	if (tmp == NULL)
	{
		printf("err:LinkStack_Pop\n");
		return NULL;
	}
	return tmp->item;
}

测试代码框架如下:

#include "linkstack.h"
#include<iostream>

//自己定义业务结点
typedef struct tag_Student
{
	char name[30];
	int age;
}Student;
int main(int argc, char*argv[])
{
	Student s1;
	Student s2;
	Student s3;
	s1.age = 11;
	s2.age = 12;
	s3.age = 13;
	LinkStack *handle = LinkStack_Create();
	LinkStack_Push(handle, (LinkStackNode*)&s1);
	LinkStack_Push(handle, (LinkStackNode*)&s2);
	LinkStack_Push(handle, (LinkStackNode*)&s3);

	Student* tmp = (Student*)LinkStack_Top(handle);
	printf("栈顶元素的值是[%d]\n", tmp->age);

	//遍历删除元素
	while (LinkStack_Size(handle) > 0)
	{
		Student* tmp = (Student*)LinkStack_Pop(handle);
		printf("被删除元素的值是[%d]\n", tmp->age);
	}
	LinkStack_Clear(handle);

	LinkStack_Destroy(handle);
	return 0;

}

输出结果如下图:

栈的链式存储结构