标签:堆栈 括号 define 种类 typedef char else turn 算术
实验内容
算术表达式中右括号和左括号匹配的次序正好符合后到括号要最先被匹配的“后进先出”堆栈操作特点,因此可以借用一个堆栈来进行判断。
具体方法:
⑴ 顺序扫描算术表达式(表现为一个字符串);
⑵ 当遇到三种类型的左括号时,让该括号进栈;
⑶ 当遇到某一种类型的右括号时,比较当前栈顶括号是否与之匹配,
⑷ 若匹配则退栈,转(1)继续进行判断;
⑸ 若不匹配,则左右括号配对次序不正确,结束。
⑹ 若字符串当前为某一类型的右括号而堆栈为空,则右括号多于左括号,结束。
⑺ 若字符串扫描结束而堆栈非空,则左括号多于右括号,结束。
⑻ 若字符串扫描结束而堆栈为空,则左右括号匹配正确,结束。
#include <stdio.h> #include <stdlib.h> #define bool int #define true 1 #define false 0 typedef struct stack { char* top; char* base; int MaxStack; }sqstack; int initstack(sqstack* S) { S->base = (char*)malloc(sizeof(int) * 100); if (S->base) { S->top = S->base; } return 0; } int pushstack(sqstack* S, char a) { *(S->top++) = a; return 0; } int popstack(sqstack* S) { int e = *(--S->top); return e; } bool empty(sqstack* S) { if (S->base == S->top) { return false; } return true; } int main() { sqstack S; int flag = 1; int i = 0; initstack(&S); char c[100]; fgets(c, 100, stdin); if (c[i] == ‘(‘ || c[i] == ‘[‘ || c[i] == ‘{‘) { pushstack(&S, c[i]); } else if (c[i] == ‘)‘ || c[i] == ‘}‘ || c[i] == ‘]‘) { flag = 0; printf("%d", flag); return flag; } i++; while (c[i] != ‘\0‘) { if (c[i] == ‘(‘ || c[i] == ‘[‘ || c[i] == ‘{‘) { pushstack(&S, c[i]); } else if (c[i] == ‘)‘ || c[i] == ‘}‘ || c[i] == ‘]‘) { if (empty(&S) == true) { char c1 = popstack(&S); if (!((c1 == ‘(‘ && c[i] == ‘)‘) || (c1 == ‘{‘ && c[i] == ‘}‘) || (c1 == ‘[‘ && c[i] == ‘]‘))) { flag = 0; printf("%d", flag); return flag; } } else { flag = 0; printf("%d", flag); return flag; } } i++; } printf("%d", flag); return flag; }
好了,我们下回见,peace
标签:堆栈 括号 define 种类 typedef char else turn 算术
原文地址:https://www.cnblogs.com/gitpy123/p/13669498.html