1 # include <stdio.h>
2 # include <malloc.h>
3 # include <stdlib.h>
4 //C语言实现栈
5
6 //结点
7 typedef struct Node{
8 int data;//数据
9 struct Node* pNext;//指针
10 }* PNODE,NODE;
11
12 //栈
13 typedef struct stack{
14 PNODE pTop;
15 PNODE pBottom;
16 }* PSTACK,STACK;
17
18 void init(PSTACK s);
19 void push(PSTACK s,int num);
20 bool isEmpty(PSTACK s) ;
21 bool pop(PSTACK s) ;
22 void traverse(PSTACK s);
23 void clear(PSTACK s) ;
24
25 int main(void)
26 {
27 STACK s;
28 init(&s);
29 if(isEmpty(&s)){
30 printf("栈为空\n");
31 }
32 //压栈
33 push(&s,1);
34 push(&s,4);
35 push(&s,5);
36 push(&s,77);
37 push(&s,16);
38 push(&s,11);
39 push(&s,2);
40 //遍历
41 traverse(&s);
42 //出栈
43 if(pop(&s)){
44 printf("出栈成功\n");
45 }
46 else{
47 printf("出栈失败\n");
48 }
49 traverse(&s);
50 clear(&s);
51 if(isEmpty(&s)){
52 printf("栈为空\n");
53 }
54 return 0;
55 }
56
57 //初始化一个空栈
58 void init(PSTACK s)
59 {
60 s->pTop = (PNODE)malloc(sizeof(NODE));
61 //判断是否申请失败
62 if(NULL == s->pTop) {
63 printf("内存申请失败");
64 exit(-1);
65 }
66 s->pBottom = s->pTop;
67 s->pBottom->pNext = NULL;
68 }
69
70 //压栈
71 void push(PSTACK s,int num)
72 {
73 //申请一个临时结点
74 PNODE tem = (PNODE)malloc(sizeof(NODE));
75 tem->data = num;
76 tem->pNext = s->pTop;
77 s->pTop = tem;
78 }
79
80 //判断栈是否为空
81 bool isEmpty(PSTACK s)
82 {
83 return s->pTop==s->pBottom;
84 }
85
86 //出栈
87 bool pop(PSTACK s)
88 {
89 if(isEmpty(s)){
90 return false;
91 }
92 else{
93 PNODE tem = s->pTop;
94 s->pTop = tem->pNext;
95 free(tem);
96 tem = NULL;
97 return true;
98 }
99 }
100
101 //遍历栈
102 void traverse(PSTACK s)
103 {
104 PNODE p = s->pTop;
105 while(p!=s->pBottom){
106 printf("%d ",p->data);
107 p = p->pNext;
108 }
109 printf("\n");
110 }
111
112 //清空栈
113 void clear(PSTACK s)
114 {
115 if(isEmpty(s)){
116 return;
117 }
118
119 PNODE p = s->pTop;
120 PNODE q = NULL;
121 while (p != s->pBottom){
122 q = p->pNext;
123 free(p);
124 p = q;
125 }
126 s->pTop = s->pBottom;
127 }