栈的链式存储

链表模拟栈

设计与实现

//头文件
#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

。✧* ꧁流痕꧂✧*。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值