栈的链式存储结构
程序员文章站
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;
}
输出结果如下图:
下一篇: 【数据结构】队列相关操作