c语言 出栈和进栈

int Push(STACK *S,int e)//进栈
{
  SNode *p;
  p=(SNode *)malloc(sizeof(SNode));
  if(!p)
   return ERROR;
  p->data=e;
  p->next=S->top;
  S->top=p;
  S->length++;
  return OK;
}

int Pop(STACK *S,int *e)//出栈
{
  SNode *p;
  if(S->top==NULL) return ERROR;
  p=S->top;
  *e=p->data;
  S->top=p->next;
  S->length--;
  return OK;

}

首先要弄明白一点,栈的结构是“先进后出“的,就像你堆积木一样,第一根放在最底层的地面上,然后一根一根往上堆。前一个放上去的总是被后一个放上去的压在底下。那我当我再想里面放一根的时候,总不能放中间或者放底下吧(除非你很无聊 很寂寞 闲的蛋疼了 先一根根把堆在上面的全部拿出来 然后把要放进去的那根放上去  最后又把刚才搬下来的有重新搬上去......此处省去几万字)所以要往上面加东西的时候,就得放在最上面。
   以上就是进栈的原理,怎么出栈呢,很简单,直接从”积木"的最顶端取下来就行了。
   ok,以上比喻完了,希望你能看得明白。接下来讲程序不说积木了:),由上面的分析 我们可以知道一个道理,对于栈的操作,栈顶的元素很重要(也就是积木最上面的那根)。为什么呢。无论是出栈还是进栈,都跟那哥们有直接的联系。你想啊,如果要是有元素要进栈的话,那么它就不能当“老顶”了,那老顶之位就要交给压在它上头那位了;如果出栈呢,它也不能当老顶了,老顶之位就要交到原来压在它底下的那个。
    ok,所以一般的栈都将栈顶的那个元素所在的位置(内存地址--数组类型的,或者指针---节点类型的)视为栈的栈顶~!通过它来对栈进出进行操作。
   一般来说(或者在我出生以来看到过的)栈有两种内存结构(注意是是内存结构,有的书说是存储结构,都一样一样滴),一种是连续的,一种是不连续的,连续的基本上就是数组了,不连续的基本上就是链表类型的啦。你上面的程序就是链表类型的,每个节点都有个指针指向它“底下”的节点(我觉得“底下”比下一个更容易理解)。通过这种你链我  我链它的方式,把一组数据连在一起。
进栈:
int Push(STACK *S,int e)//进栈
{
  SNode *p;      //step1:这个编程习惯不好,没定义一个指针就应该把它指向NULL
  p=(SNode *)malloc(sizeof(SNode));  //step2:为你的节点分配内存
  if(!p)
   return ERROR;
  p->data=e;  //step3:当然了,你那个传进来的e是相当于temp,用来传值的,ok,那就把它的 数据给p咯,p实际指向的是一块内存块,用来装节点的
  p->next=S->top; //step4:回到上面积木问题,进栈的时候,原来的老顶要给新来的让位,但是如果这时候的top节点直接赋给新来的元素的话,那么那个原来的老顶是不是从此以后都找不到它了?所以,先把新来的元素的next指针指向当前的老顶,这样的话,以后通过next指针就可以找到它了。
  S->top=p; //当然,都已经处理好以前老顶的身后事了(就是以后可以通过p的next指针找到它了)那么“让位”就可以进行了,这时,p便戴上了 老顶 之帽了
  S->length++; //既然人数都增加了,那就到公安局登记入户口吧
  return OK; //一切over,现在这个栈stack的栈顶位置就是你刚才新加进来的p了,通过stock.top指针就可以访问到栈顶,然后出栈也是同理的,ok,all over
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值