数据结构之栈

  1 //链栈C++描述
  2 #include <iostream>
  3 using namespace std;
  4 
  5 struct Node
  6 {
  7   int data;               //数据域
  8   Node *next;       //指针域
  9 };
 10 
 11 
 12 class LinkStack
 13 {
 14 public:
 15   LinkStack();                     //构造函数,初始化一个空链栈
 16   ~LinkStack();                    //析构函数,释放链栈各结点的存储空间
 17   void Push(int x);            //入栈操作,将元素x入栈
 18   int Pop();                 //出栈操作,将栈顶元素出栈
 19   int GetTop();              //取栈顶元素(并不删除)
 20   int Empty();                    //判空操作,判断链栈是否为空栈
 21 private:
 22   Node *top;                       //栈顶指针即链栈的头指针
 23 };
 24 
 25 
 26 LinkStack::LinkStack()
 27 {
 28   top = new Node;                      //生成头结点
 29   top->data = 0;
 30   top->next = NULL;                      //头结点的指针域置空
 31 }
 32 
 33 
 34 LinkStack :: ~LinkStack()
 35 {
 36   Node *q = NULL;
 37   while (top != NULL)        //释放链栈的每一个结点的存储空间
 38   {
 39     q = top;                 //暂存被释放结点
 40     top = top->next;         // top指向被释放结点的下一个结点
 41     delete q;
 42   }
 43   q = NULL;
 44 }
 45 
 46 
 47 int LinkStack::GetTop()
 48 {
 49   if (top == NULL)
 50     throw "下溢异常";
 51   else
 52     return top->data;
 53 }
 54 
 55 
 56 
 57 void LinkStack::Push(int x)
 58 {
 59   Node *s = NULL;
 60   s = new Node; s->data = x;         //申请结点s数据域为x
 61   s->next = top; top = s;              //将结点s插在栈顶
 62 }
 63 
 64 
 65 int LinkStack::Pop()
 66 {
 67   Node *p = NULL;
 68   int x;
 69   if (top == NULL) throw "下溢";
 70   x = top->data; p = top;                //暂存栈顶元素
 71   top = top->next;                     //将栈顶结点摘链
 72   delete p;
 73   return x;
 74 }
 75 
 76 
 77 int LinkStack::Empty()
 78 {
 79   if (top->next == NULL)
 80     return 1;
 81   else
 82     return 0;
 83 }
 84 
 85 int main()
 86 {
 87   int x, y, z;
 88   LinkStack S;                                        //定义链栈变量S
 89   S.Push(1);
 90   S.Push(2);
 91   cout << "取栈顶元素" << S.GetTop()<<endl;
 92   cout << "栈顶元素出栈" << S.Pop()<<endl;
 93   if (S.Empty() == 1) cout << "栈为空" << endl;
 94   else cout << "栈非空" << endl;                    //栈有2个元素,输出栈非空
 95   return 0;
 96 }
 97 
 98 
 99 
100 //C语言描述
101 # include <stdio.h>
102 # include <malloc.h>
103 # include <stdlib.h>
104 
105 typedef struct Node
106 {
107   int data;
108   struct Node * pNext;
109 }NODE, * PNODE;
110 
111 typedef struct Stack
112 {
113   PNODE pTop;
114   PNODE pBottom;
115 }STACK, * PSTACK;  //PSTACK 等价于 struct STACK *
116 
117 void init(PSTACK);
118 void push(PSTACK, int );
119 void traverse(PSTACK);
120 bool pop(PSTACK, int *);
121 void clear(PSTACK pS);
122 
123 int main(void)
124 {
125   STACK S;  //STACK 等价于 struct Stack
126   int val;
127 
128   init(&S);  //目的是造出一个空栈
129   push(&S, 1); //压栈
130   push(&S, 2);
131   push(&S, 3);
132   push(&S, 4);
133   push(&S, 5);
134   push(&S, 6);
135   traverse(&S); //遍历输出
136   
137   clear(&S);
138   //traverse(&S); //遍历输出
139 
140   if ( pop(&S, &val) )
141   {
142     printf("出栈成功,出栈的元素是%d\n", val);
143   }
144   else
145   {
146     printf("出栈失败!\n");
147   }
148 
149   traverse(&S); //遍历输出
150 
151   return 0;
152 }
153 
154 void init(PSTACK pS)
155 {
156   pS->pTop = (PNODE)malloc(sizeof(NODE));
157   if (NULL == pS->pTop)
158   {
159     printf("动态内存分配失败!\n");
160     exit(-1);
161   }
162   else
163   {
164     pS->pBottom = pS->pTop;
165     pS->pTop->pNext = NULL; //pS->Bottom->pNext = NULL;
166   }
167 }
168 
169 void push(PSTACK pS, int val)
170 {
171   PNODE pNew = (PNODE)malloc(sizeof(NODE));
172   
173   pNew->data = val;
174   pNew->pNext = pS->pTop; //pS->Top不能改成pS->Bottom
175   pS->pTop = pNew;
176 
177   return;
178 }
179 
180 void traverse(PSTACK pS)
181 {
182   PNODE p = pS->pTop;
183 
184   while (p != pS->pBottom)
185   {
186     printf("%d  ", p->data);
187     p = p->pNext;
188   }
189   printf("\n");
190 
191   return;
192 }
193 
194 bool empty(PSTACK pS)
195 {
196   if (pS->pTop == pS->pBottom)
197     return true;
198   else
199     return false;
200 }
201 
202 //把pS所指向的栈出栈一次,并把出栈的元素存入pVal形参所指向的变量中,如果出栈失败,返回false,否则返回true
203 bool pop(PSTACK pS, int * pVal)
204 {
205   if ( empty(pS) ) //pS本身存放的就是S的地址
206   {
207     return false;
208   }
209   else
210   {
211     PNODE r = pS->pTop;
212     *pVal = r->data;
213     pS->pTop = r->pNext;
214     free(r);
215     r = NULL;
216 
217     return true;
218   }
219 }
220 
221 //clear清空
222 void clear(PSTACK pS)
223 {
224   if (empty(pS))
225   {
226     return;
227   }
228   else
229   {
230     PNODE p = pS->pTop;
231     PNODE q = NULL;
232 
233     while (p != pS->pBottom)
234     {
235       q = p->pNext;
236       free(p);
237       p = q;
238     }
239     pS->pTop = pS->pBottom;
240   }
241 }

 

posted @ 2020-11-22 09:39  丁帅帅dss  阅读(101)  评论(0)    收藏  举报