1 /*
2 栈是限制插入和删除只能在一个位置上进行的表,该位置是表的末端(最后进入栈的元素位置),叫做栈的顶。
3 栈具有后进先出的特点,用链表实现时可采用首插法实现这一特性。
4 对于栈,进栈操作要检查栈是否有空间;出栈和取栈顶值要检查栈是否为空栈。
5 */
6
7 /*栈的链表实现*/
8
9 /*接口头文件*/
10 typedef int ElementType;
11
12 #ifndef _STACK_H
13 #define _STACK_H
14 #include <stdbool.h>
15
16 struct Node;
17 typedef struct Node * PtrToNode;
18 typedef PtrToNode Stack;
19 typedef PtrToNode Position;
20
21 /*操作集*/
22 bool IsEmpty( Stack S );
23 Stack CreateStack( void );
24 void MakeEmpty( Stack S );
25 void Pop( Stack S );
26 void Push( ElementType X, Stack S );
27 ElementType Top( Stack S );
28 void DisposeStack( Stack S );
29 void PrintfStack( Stack S );
30
31 #endif
32
33
34 /*接口实现*/
35 #include <stdio.h>
36 #include <stdlib.h>
37 #include "stack.h"
38
39 /*特定结构体定义*/
40 struct Node
41 {
42 ElementType Element;
43 Position Next;
44 };
45
46 bool IsEmpty( Stack S )
47 {
48 return S->Next ==NULL;
49 }
50
51 Stack CreateStack( void )
52 {
53 Stack S;
54
55 S = ( Stack )malloc( sizeof( struct Node ) );
56 if ( S == NULL )
57 {
58 printf( "No Space!!!\n" );
59 exit( 1 );
60 }
61 S->Next = NULL;
62 /*确保S是空栈*/
63 MakeEmpty( S );
64
65 return S;
66 }
67
68 void MakeEmpty( Stack S )
69 {
70 Position P;
71
72 if ( S == NULL )
73 {
74 printf( "No use CreateStack!!!\n" );
75 exit( 1 );
76 }
77 else
78 while ( ! IsEmpty( S ) )
79 Pop( S );
80 }
81
82 void Pop( Stack S )
83 {
84 Position P;
85
86 if ( IsEmpty( S ) )
87 {
88 printf( "Stack is empty!!!\n" );
89 exit( 1 );
90 }
91 else
92 {
93 P = S->Next;
94 S->Next = S->Next->Next;
95 free( P );
96 }
97 }
98
99 void Push( ElementType X, Stack S )
100 {
101 Position P;
102
103 P = ( Stack )malloc( sizeof( struct Node ) );
104 if ( P == NULL )
105 {
106 printf( "No Space!!!\n" );
107 exit( 1 );
108 }
109 else
110 {
111 P->Element = X;
112 P->Next = S->Next;
113 S->Next = P;
114 }
115 }
116
117 ElementType Top( Stack S )
118 {
119 if ( IsEmpty( S ) )
120 {
121 printf( "Stack is empty!!!\n" );
122 exit( 1 );
123 }
124 else
125 return S->Next->Element;
126 }
127
128 void DisposeStack( Stack S )
129 {
130 /*
131 Position P;
132
133 while ( S->Next != NULL )
134 {
135 P = S->Next;
136 S->Next = S->Next->Next;
137 free( P );
138 }
139 */
140 MakeEmpty( S );
141 /*释放栈头*/
142 free( S );
143 }
144
145 /*打印栈,且把栈变为空栈*/
146 void PrintfStack( Stack S )
147 {
148 while ( ! IsEmpty( S ) )
149 {
150 printf( "%3d", Top( S ) );
151 Pop( S );
152 }
153 printf( "\n" );
154 }
155
156
157 //平衡符号,检查输入的算式是否正确只检查{},(),[]三种,例如(a+b){[d]c*d}{}是正确的,但是(a+b){{[d]c*d}{}不对
158 void balance(char * ch, Stack S)
159 {
160 ElementType c;
161 MakeEmpty(S);
162 while ((c = *ch) != '\0')//一个一个读入字符,直到遇到字符数组结束符
163 {
164 printf("%c ", c);//打印出读入的字符
165 switch (c)
166 {
167 //如果是开放符号{,(,[,就推入栈中,除此之外的任何符号都不推入栈中
168 case '(':
169 case '[':
170 case '{': Push(c, S); break; //然后停止switch
171
172 //如果是封闭符号},),],分情况
173 case ')':
174 if (IsEmpty(S))//如果栈为空,说明字符数组不平衡
175 {
176 fprintf(stderr, "The symbols not balance!\n");
177 return;
178 }
179 else
180 {
181 if (Top(S) == '(')//当读入")"时,而此时栈顶符号为"(",匹配
182 {
183 Pop(S);//就把栈顶元素出栈
184 }
185 else//否则就不平衡
186 {
187 fprintf(stderr, "The symbols not balance!\n");
188 return;
189 }
190 }
191 break;
192 //其他情况一样
193 case ']':
194 if (IsEmpty(S))
195 {
196 fprintf(stderr, "The symbols not balance!\n");
197 return;
198 }
199 else
200 {
201 if (Top(S) == '[')
202 {
203 Pop(S);
204 }
205 else
206 {
207 fprintf(stderr, "The symbols not balance!\n");
208 return;
209 }
210 }
211 break;
212 case '}':
213 if (IsEmpty(S))
214 {
215 fprintf(stderr, "The symbols not balance!\n");
216 return;
217 }
218 else
219 {
220 if (Top(S) == '{')
221 {
222 Pop(S);
223 }
224 else
225 {
226 fprintf(stderr, "The symbols not balance!\n");
227 return;
228 }
229 }
230 break;
231 default:
232 break;
233 }
234 ch++;
235 }
236 if (IsEmpty(S))
237 {
238 fprintf(stdout, "The Symbols Balance!\n");
239 }
240 else
241 {
242 fprintf(stderr, "The Symbols Not Balance!\n");
243 }
244 }