栈的实现
/* * 栈的实现可以用链表或数组的方式(下面代码为数组实现) * 栈的应用:平衡符号 * 算法说明:创建一个栈,顺序读取文本的每个字符,遇到开放符号则进栈; * 遇到闭合符号时,弹出栈顶元素并与读取的闭合符号比较,是否为成对的符号 */ #include <stdio.h> #include <stdlib.h> #define Error(Str) FatalError(Str); #define FatalError(Str) fprintf(stderr, "%s\n", Str), exit(1) #define EmptyTOS (-1) #define MinStackSize (5) typedef char ElementType; struct StackRecord; typedef struct StackRecord *Stack; struct StackRecord { int Capacity; int TopOfStack; ElementType *Array; }; Stack CreateStack(int MaxElements); void DisposeStack(Stack S); int IsEmpty(Stack S); int IsFull(Stack S); void MakeEmpty(Stack S); void Push(ElementType X, Stack S); ElementType Top(Stack S); void Pop(Stack S); ElementType TopAndPop(Stack S); /* * 栈的创建 */ Stack CreateStack(int MaxElements) { Stack S; if(MaxElements < MinStackSize) Error("Out of space!!!"); S = malloc(sizeof(struct StackRecord)); if(S == NULL) FatalError("Out of space!!!"); S->Array = malloc(sizeof(ElementType) * MaxElements); if(S->Array == NULL) FatalError("Out of space!!!"); S->Capacity = MaxElements; MakeEmpty(S); return S; } /* * 将栈置空 */ void MakeEmpty(Stack S) { S->TopOfStack = EmptyTOS; } /* * 栈的释放 */ void DisposeStack(Stack S) { if(S != NULL) { free(S->Array); free(S); } } /* * 检测一个栈是否为空 */ int IsEmpty(Stack S) { return S->TopOfStack == EmptyTOS; } /* * 检测一个栈是否已满 */ int IsFull(Stack S) { return S->TopOfStack == S->Capacity - 1; } /* * 进栈 */ void Push(ElementType X, Stack S) { if(IsFull(S)) { Error("Full stack"); } else S->Array[++S->TopOfStack] = X; } /* * 将栈顶返回 */ ElementType Top(Stack S) { if(!IsEmpty(S)) return S->Array[S->TopOfStack]; Error("Empty stack"); return 0; } /* * 从栈弹出元素 */ void Pop(Stack S) { if(IsEmpty(S)) { Error("Empty stack"); } else S->TopOfStack--; } /* * 给出栈顶元素并从栈弹出 */ ElementType TopAndPop(Stack S) { if(!IsEmpty(S)) return S->Array[S->TopOfStack--]; //Error("Empty stack"); return 0; } int main() { FILE *stream; int ch,is_empty; ElementType close_ch; stream = fopen("./code.txt","r"); //创建一个能存放1000个元素的栈 Stack stacker; stacker = CreateStack(1000); int line = 1,flag = 1; while((ch=fgetc(stream))!=EOF) { //开放符号进栈 if(ch == '{' || ch == '(') Push(ch, stacker); //闭合符号,和栈顶元素进行成对比较 if(ch == '}' || ch == ')') { close_ch = TopAndPop(stacker); switch(ch) { case '}': if(close_ch != '{') { flag = 0; printf("第%d行的符号不平衡,皮卡!⊙﹏⊙‖\n", line); } break; case ')': if(close_ch != '(') { flag = 0; printf("第%d行的符号不平衡,皮卡!⊙﹏⊙‖\n", line); } break; default: break; } } //文本行数统计 if(ch == '\n') line++; } fclose(stream); is_empty = IsEmpty(stacker); if(flag) { if(is_empty) printf("文本没有不平衡的符号,皮卡!^_^\n"); else printf("第%d行的符号不平衡,皮卡!⊙﹏⊙‖\n", line); } }
栈的应用
四则运算
后缀表达式的计算
函数调用:当在主函数中调用新函数时,需要先将主函数中的所有局部变量、执行新函数时的位置保存在栈中,当新函数执行完成后,再从栈中取数据并继续往下执行;