1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <malloc.h>
4 #include <stdbool.h>
5
6 typedef struct Node{
7 int data;
8 struct Node * pNext;
9 }NODE, *PNODE;
10
11 typedef struct Stack{
12 PNODE pTop;
13 PNODE pBottom;
14 }STACK, *PSTACK; //PSTACK等价于struct Stack
15
16 void initStack(PSTACK pS);
17 void pushStack(PSTACK pS, int val);
18 bool popStack(PSTACK pS, int *pVal);
19 void traverse(PSTACK pS);
20 bool isEmpty(PSTACK pS);
21 void clear(PSTACK pS);
22
23 int main()
24 {
25 int val;
26 STACK s; //STACK等价于struct Stack;
27 initStack(&s);
28 pushStack(&s, 1);
29 pushStack(&s, 2);
30 pushStack(&s, 3);
31 pushStack(&s, 4);
32 pushStack(&s, 5);
33 pushStack(&s, 6);
34 traverse(&s);
35 if(popStack(&s, &val)){
36 printf("出栈成功!\n");
37 printf("出栈的元素是:%d!\n", val);
38 }else{
39 printf("出栈失败!\n");
40 }
41
42 traverse(&s);
43
44 clear(&s);
45 traverse(&s);
46
47 system("pause");
48 return 0;
49 }
50
51 void initStack(PSTACK pS){
52
53 pS->pTop = (PNODE)malloc(sizeof(NODE));
54 if(NULL == pS->pTop){
55 printf("动态内存分配失败!\n");
56 exit(-1);
57 }else{
58 pS->pBottom = pS->pTop;
59 pS->pTop->pNext = NULL; //pS->pBottom->pNext = NULL;
60 //头节点所指向的指针域为空
61 }
62 }
63
64 void pushStack(PSTACK pS, int val){
65 PNODE pNew = (PNODE)malloc(sizeof(NODE));
66 pNew->data = val;
67 pNew->pNext = pS->pTop; // pS->pTop不能改成pS->pBotton
68 pS->pTop = pNew; //栈顶指向新节点
69 return ;
70 }
71
72
73 void traverse(PSTACK pS){
74 PNODE p = pS->pTop;
75 printf("遍历栈:\n");
76 while(p != pS->pBottom){
77 printf("%d ", p->data);
78 p = p->pNext;
79 }
80 printf("\n");
81 }
82
83 bool isEmpty(PSTACK pS){
84 if(pS->pTop == pS->pBottom)
85 return true;
86 else
87 return false;
88 }
89
90 //把pS所指向的栈出栈一次,并把出栈的元素存入pVal形参所指向的变量中
91 bool popStack(PSTACK pS,int *pVal){
92 if(isEmpty(pS)){ //pS本身存放的就是S的地址
93 printf("出栈失败!\n");
94 return false;
95 }
96
97 PNODE r = pS->pTop;
98 *pVal = r->data;
99 pS->pTop = r->pNext;
100 free(r);
101 r = NULL;
102 return true;
103 }
104
105 void clear(PSTACK pS){
106 if(isEmpty(pS)){
107 return;
108 }
109
110 PNODE p = pS->pTop;
111 PNODE q = NULL;
112 while(p != pS->pBottom){
113 q = p->pNext;
114 free(p);
115 p = q;
116 }
117 pS->pTop = pS->pBottom;
118 }