数据结构:栈

  1 # include <stdio.h>
  2 # include <malloc.h>
  3 # include <stdlib.h>
  4 
  5 typedef  struct Node  
  6 {
  7      int data;
  8      struct Node * pNext;
  9 }NODE, * PNODE;
 10 typedef  struct Stack  
 11 {
 12     PNODE pTop;
 13     PNODE pBottom;
 14 }STACK, * PSTACK;
 15 
 16  void init(PSTACK pS);
 17  void push(PSTACK, int);
 18  void traverse(PSTACK);
 19  bool pop(PSTACK, int *);
 20  bool empty(PSTACK);
 21  void clear(PSTACK pS);
 22 
 23  int main( void)
 24 {
 25     STACK S;
 26      int val;
 27     
 28     init(&S);
 29     push(&S, 1);
 30     push(&S, 2);
 31     push(&S, 3);
 32     push(&S, 4);                
 33     push(&S, 5);
 34     traverse(&S);
 35     
 36      if(pop(&S,&val))
 37     {    
 38         printf( " 出栈成功,出栈的元素是:%d\n ",val);
 39     }
 40      else
 41     {
 42         printf( " 出栈失败 ");
 43         
 44     }
 45     
 46     traverse(&S);
 47     clear(&S);
 48     traverse(&S);
 49     
 50      return  0;
 51 }
 52 
 53  void init(PSTACK pS)   // 初始化
 54  {
 55     pS->pTop = (PNODE)malloc( sizeof(NODE));
 56      if(NULL == pS->pTop)
 57     {
 58         printf( " 分配失败\n ");
 59         exit(- 1);
 60     }
 61      else
 62     {
 63         pS->pBottom = pS->pTop;
 64         pS->pTop->pNext = NULL;  // 也可以写成pS->pBottom->pNext = NULL;
 65      }
 66     
 67 }
 68  void push(PSTACK pS, int val)    // 压栈
 69  {
 70     PNODE pNew  = (PNODE)malloc( sizeof(NODE));
 71     pNew->data  =  val;
 72     pNew->pNext = pS->pTop;  // pS->pTop不能改成pS->pBottom;
 73      pS->pTop    = pNew;
 74     
 75 } 
 76  void traverse(PSTACK pS)    // 遍历
 77  {
 78     PNODE p = pS->pTop;
 79     
 80      while (p != pS->pBottom)
 81     {
 82         printf( " %d  ",p->data);
 83         p =p->pNext;
 84     }
 85     printf( " \n ");
 86      return;
 87 }
 88  bool empty(PSTACK pS)    // 判断是否为空
 89  {
 90      if(pS->pTop ==pS->pBottom)
 91          return  true;
 92      else
 93          return  false;
 94 }
 95  // 把pS所指向的栈出栈一次,将元素pVal所指向的变量中
 96  bool pop(PSTACK pS, int * pVal)    // 出栈
 97  {
 98      if(empty(pS))    // pS本身就是存放
 99      {
100          return  false;
101     }
102      else
103     {
104         PNODE r = pS->pTop;
105         *pVal = r->data;
106         pS->pTop = r->pNext;
107         free(r);
108         r = NULL;
109         
110          return  true;
111     }
112 }
113 
114  void clear(PSTACK pS)    // 清空数据
115  {
116      if(empty(pS))
117     {
118          return;
119     }
120      else
121     {
122         PNODE p = pS->pTop;
123         PNODE q = NULL;
124         
125          while(p !=pS->pBottom)
126         {
127             q = p->pNext;
128             free(p);
129             p=q;
130         }
131         pS->pTop = pS->pBottom;
132     }
133     
134 }
135  /*
136  在VC++6.0中运行的结果为:
137  ==================================
138  5 4 3 2 1
139  出栈成功,出栈的元素是:5
140  4 3 2 1
141 
142  Press any key to continue
143  ==================================
144  */

转载于:https://www.cnblogs.com/jssong20000/archive/2012/11/08/2760872.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值