链表模拟栈
设计与实现
//头文件
#ifndef_MY_LINKSTACK_H_
#define _MY_LINKSTACK_H_
typedef void LinkStack;
LinkStack* LinkStack_Create();
void LinkStack_Destroy(LinkStack* stack);
void LinkStack_Clear(LinkStack* stack);
int LinkStack_Push(LinkStack* stack,void* item);
void* LinkStack_Pop(LinkStack* stack);
void* LinkStack_Top(LinkStack* stack);
int LinkStack_Size(LinkStack* stack);
#endif//_MY_LINKSTACK_H_
//主函数
void main()
{
int i=0;
int a[10];
LinkStack* stack = NULL;
stack = LinkStack_Create();
if(stack == NULL)
{
return ;
}
//添加元素
for(i=0;i<5;i++)
{
a[i] = i+1;
LinkStack_Push(stack,&a[i]);
}
//获取栈的基本属性
cout<<"len:"<<LinkStack_Size(stack);
cout<<"top:"<<(int*)LinkStack_Top(stack);
//删除栈元素
while(LinkStack_Size(stack)>0)
{
int tmp=*((int*)LinkStack_Pop(stack));
cout<<"tmp:"<<tmp;
}
//销毁栈
LinkStack_Destroy(stack);
}
从线性表的头部插入元素,可防止元素的遍历
从而可以用线性表来模拟栈的链式存储
#include "linklist.h"
typedef struct Teacher//链表的 业务节点
{
LinkListNode node;//第一个域(第一个元素)
void* item;//栈的业务节点
}Teacher;
//创建栈 相当于 创建一个线性表
LinkStack* LinkStack_Create()
{
return LinkList_Create();
}
//销毁栈 相当于 销毁一个线性表
void LinkStack_Destroy(LinkStack* stack)
{
return ;
}
//清空栈 相当于 清空线性表 涉及到栈元素生命周期的管理
void LinkStack_Clear(LinkStack* stack)
{
return;
}
//向栈中添加元素 相当于 向线性表的头部插入元素
//void* item 栈的业务节点 ---> 转化成 链表的业务节点
int LinkStack_Push(LinkStack* stack,void* item)
{
Teacher *temp = NULL;
tmp = (Teacher*)malloc(sizeof(Teacher));
if(tmp == NULL)
{
return -1;
}
memset(tmp,0,sizeof(Teacher));
tmp->item = item;
LinkList_Insert(stack,(LinkListNode*)tmp,0);
if(ret!=0)
{
cout<<"func LinkList_Insert() err:"<<ret<<endl;
if(tmp!=NULL)
{
delete tmp;
}
return ret;
}
return 0;
}