C语言 链式栈和顺序栈的实现

1、简介:

栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

术语解释:
栈顶(Top) :允许数据插入和删除的端,即栈的顶端。
栈底(Bottom):固定并且不允许进行插入和删除操作的一端,即栈底。
栈空:即不含有任何元素的栈。
进栈、入栈或压栈:数据进入栈。
出栈或退栈:数据出栈

在这里插入图片描述

2、链式栈的基本操作

链式栈

2.1、初始化一个栈
 void initStack(struct Stack *ps)//初始化一个栈
 {
   
 	 //将栈顶指向头指针,ps->pTopZ这是个指针用于存放地址 
     ps->pTop=(struct Node*)malloc(sizeof(struct Node));  
     if(NULL==ps->pTop)   //判断分配是否成功 
     {
   
         printf("动态内存分配失败");
         exit(-1);
     }
     else
     {
   
     ps->PBottom=ps->pTop;//栈底和栈顶都指向头指针
     ps->PBottom->pNext=NULL;//将指针域清空
     }
     }

在这里插入图片描述

2.2、进栈
  int pushStack(struct Stack *ps,int i)
  {
   
   struct Node *pNew=(struct Node*)malloc(sizeof(struct Node));//造一个新的指针指向一个节点 
   pNew->date=i;//将数据存入新的节点的数据域中 
   pNew->pNext=ps->pTop;//把前一个节点的地址(ps->pTop存放地址),赋给后一个节点的指针域。所以后一个节点指向前一个节点 
   ps->pTop=pNew;//在把新的节点的地址付给ps->pTop 
  }

在这里插入图片描述

2.3、出栈
bool pop(struct Stack *ps,int *pval)//把ps指向的栈出栈一次,并把出栈的元素存入pval中
    {
   
    	
         if(empty(ps))//如果为空直接出栈 
         {
   
             return false;
        }
        else
        {
   
       struct Node *r=ps->pTop;//将栈顶的地址付给方便不需要的空间释放 
       *pval=r->date;//把出栈的值存放,方便操作
	   ps->pTop=r->pNext;
	   free(r);//把r指向的空间释放 
	   r=NULL;
	   return true; 
        }
    }

在这里插入图片描述

2.4、遍历一个栈
 void traverseStack(struct Stack *ps)
  {
   

      struct Node *p=ps->pTop;
      while(p!=ps->PBottom)
      {
   

          printf("%d",p->date);
          p=p->pNext;  //高存放着低的地址 
      }
      printf("\n");
  }
2.5、判断栈是否为空
  bool empty(struct Stack *ps)//判断栈是否为空 
  {
   
      if(ps->pTop==ps->PBottom)
      {
   
          return true;
      }
      else
      {
   
          return false;
      }
  }
2.6、清空一个栈
bool pop(struct Stack *ps,int *pval)//把ps指向的栈出栈一次,并把出栈的元素存入pval中
{
   
	
     if(empty(ps))//如果为空直接出栈 
     {
   
         return false;
    }
    else
    {
   
   struct Node *r=ps->pTop;//将栈顶的地址付给方便不需要的空间释放 
   *pval=r->date;//把出栈的值存放,方便操作
   ps->pTop=r->pNext;
   
  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

梨花落-

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

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

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

打赏作者

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

抵扣说明:

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

余额充值