描述:
假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序任意,即([]())或[([][])]等都为正确的格式,而[(])为不正确的格式。利用栈编程序检验表达式中的括号是否合法。
思路:
1,先实现栈的基本操作:初始化,入栈,出栈等。
2,每读入一个括号,若是右括号,则或者是置于栈顶的左括号得以消解,或者是不合法的情况;若是左括号,则直接入栈。
细节:遇左括号则进栈,遇右括号,出栈与之匹配消解。
#include <stdio.h> #include <string.h> #define MaxSize 100 typedef char DataType; typedef struct{ DataType data[MaxSize]; int top; }Stack; void InitStack(Stack *S) { S->top=-1; } void Push(Stack *S,DataType x) { if(S->top==MaxSize-1) printf(" 栈满,无法压栈! "); S->top++; S->data[S->top]=x; } int EmptyStack(Stack *S) { if(S->top== -1) return 1; else return 0; } void Pop(Stack *S,DataType *x) { if(EmptyStack(S)) printf(" 栈空,无法出栈!"); *x=S->data[S->top]; S->top--; } void main() { char str[100]="{}[()]"; int flag=1; Stack S; DataType e; InitStack(&S); //scanf("%s",s); for(int i=0;i< strlen(str);i++) { if ( str[i]=='(' || str[i]=='[' || str[i]=='{') Push(&S,str[i]); if (str[i]==')' || str[i]==']' || str[i]=='}') { //有一类情况:[[]]]),栈也为空,所以不能直接不空即出栈 if (EmptyStack(&S)) { flag=0; break; } else { Pop(&S,&e); //出栈顶元素,与刚输入的匹配 if ( str[i]==')' && e!='(' || str[i]==']' && e!='[' || str[i]=='}' && e!='{' ) { flag=0; break; } } } } if (flag==1 && EmptyStack(&S)) printf("表达式中的括号合法! "); else printf("不合法! "); }
结果: