动态栈的实现(Data structure course from HaoBin)

是一种可以实现“先进后出”的存储结构,其次栈是一种线性结构。

栈的分类:                      栈的算法:

  静态栈          出栈        

  动态栈          压栈

以下,我们实现一个动态栈,动态栈实质上就是一个操作受限的链表,完整代码如下所示:

  1 /*
  2     filename: stack.c
  3 */
  4 #include <stdio.h>
  5 #include <malloc.h>
  6 
  7 typedef enum{false, true} bool;
  8 
  9 struct Node
 10 {
 11     int data; //数据域
 12     struct Node * pNext; //指针域
 13 };
 14 
 15 struct Stack
 16 {
 17     struct Node * pTop; //栈顶指针
 18     struct Node * pBottom; //栈底指针
 19 };
 20 
 21 void init_stack(struct Stack * pS); //初始化,造一个空栈
 22 void push(struct Stack * pS, int val); //入栈
 23 bool empty_stack(struct Stack * pS); //判断栈是否为空
 24 void traverse_stack(struct Stack * pS); //遍历输出
 25 bool pop(struct Stack * pS, int *pVal); //出栈
 26 void clear_stack(struct Stack * pS); //清空栈
 27 
 28 int main(void)
 29 {
 30     struct Stack pS;
 31     int val;
 32 
 33     init_stack(&pS); //造一空栈
 34     push(&pS, 1); //入栈
 35     push(&pS, 2); //...
 36     push(&pS, 3); //...
 37     push(&pS, 4); //...
 38     push(&pS, 5); //入栈
 39     printf("the stack:");
 40     traverse_stack(&pS);
 41 
 42     if (pop(&pS, &val)) //出栈
 43         printf("pop successful. val = %d\n", val);
 44     else
 45         printf("pop failed.\n");
 46     printf("the stack:");
 47     traverse_stack(&pS);
 48 
 49     clear_stack(&pS); //清空栈
 50     printf("the stack:");
 51     traverse_stack(&pS);
 52 
 53     return 0;
 54 }
 55 
 56 /* 初始化,造一个空栈 */
 57 void init_stack(struct Stack * pS)
 58 {
 59     pS->pTop = (struct Node *)malloc(sizeof(struct Node));
 60     if (NULL == pS->pTop)
 61     {
 62         printf("failed to allocate memory.\n");
 63         exit(-1);
 64     }
 65     else
 66     {
 67         pS->pBottom = pS->pTop;
 68         pS->pBottom->pNext = NULL;
 69     }
 70     return;
 71 }
 72 
 73 /* 入栈 */
 74 void push(struct Stack * pS, int val)
 75 {
 76     struct Node * pNew = (struct Node *)malloc(sizeof(struct Node));
 77     if (NULL == pNew)
 78     {
 79         printf("failed to allocate memory.\n");
 80         exit(-1);
 81     }
 82     else
 83     {
 84         pNew->data = val;
 85         pNew->pNext = pS->pTop;
 86         pS->pTop = pNew;
 87     }
 88     return;
 89 }
 90 
 91 /* 判断栈是否为空 */
 92 bool empty_stack(struct Stack * pS)
 93 {
 94     if (pS->pTop == pS->pBottom)
 95         return true;
 96     else
 97         return false;
 98 }
 99 
100 /* 遍历输出 */
101 void traverse_stack(struct Stack * pS)
102 {
103     struct Node * p = pS->pTop;
104 
105     while (p != pS->pBottom)
106     {
107         printf("%d ", p->data);
108         p = p->pNext;
109     }
110     printf("\n");
111     return;
112 }
113 
114 /* 出栈 */
115 bool pop(struct Stack * pS, int *pVal)
116 {
117     if (empty_stack(pS)) //若栈为空
118         return false;
119     else
120     {
121         struct Node * q = pS->pTop;
122 
123         *pVal = q->data;
124         pS->pTop = q->pNext;
125         free(q);
126         q = NULL;
127 
128         return true;
129     }
130 }
131 
132 /* 清空栈 */
133 void clear_stack(struct Stack * pS)
134 {
135     if (empty_stack(pS))
136         return;
137     else
138     {
139         struct Node * p = pS->pTop; //指向栈顶元素
140         struct Node * q = NULL; //指向栈顶元素下一个元素
141 
142         while (p != pS->pBottom)
143         {
144             q = p->pNext;
145             free(p);
146             p = q;
147         }
148         pS->pTop = pS->pBottom;
149         return;
150     }
151 }
152 /*
153 the output results in Code::Blocks 10.05
154 ----------------------------------------------------
155 the stack:5 4 3 2 1
156 pop successful. val = 5
157 the stack:4 3 2 1
158 the stack:
159 
160 Process returned 0 (0x0)   execution time : 0.009 s
161 ----------------------------------------------------
162 */

 

posted @ 2013-09-29 10:22  unfickleness  阅读(246)  评论(0编辑  收藏  举报