3.2栈的应用举例 例1:括号匹配的检验 假设一个算法表达式中包含圆括号、方括号和花括 号三种类型的括号,编写一个判别表达式中括号是 否正确配对的函数 设计思路:用栈暂存左括号
1 3.2 栈的应用举例 例1:括号匹配的检验 假设一个算法表达式中包含圆括号、方括号和花括 号三种类型的括号,编写一个判别表达式中括号是 否正确配对的函数。 设计思路:用栈暂存左括号
void ExpIsCorrect(char exp[l, int n) //判断有n个字符的字符串exp左右括号是否配对正确 I SeqStack my Stack; int i, char c StackInitiate(&my Stack) for(i=0; i<n; i++) Hif((exp[i]=='(')I(exp[i]=='[')(exp[i] t')) StackPush(&myStack, exp[]) else if(expli]==')'&& StackNotEmpty(my Stack & StackTop(myStack, &c)&&c () StackPop(&my Stack, &c)
2 void ExpIsCorrect(char exp[], int n) //判断有n个字符的字符串exp左右括号是否配对正确 { SeqStack myStack; int i; char c; StackInitiate(&myStack); for(i=0;i<n;i++) {if((exp[i]=='(')||(exp[i]== '[')||(exp[i]== '{')) StackPush(&myStack, exp[i]); else if(exp[i] == ')' && StackNotEmpty(myStack) && StackTop(myStack, &c) && c == '(') StackPop(&myStack, &c);
else if(expli]==')'&& StackNotEmpty(my Stack) && Stack Top( my Stack,&c)&匙c!=’() printf("左右括号配对次序不正确!\n") return; else if(expli]== ']'&& StackNotEmpty(myStack && StackTop( my Stack,&c)&匙c=’[) StackPop(&myStack, &c) else if(exp[i]==']'&& Stack NotEmpty(my Stack & StackTop(my Stack &c)&&c! =[) printf("左右括号配对次序不正确!\n"); return;}
3 else if(exp[i] == ')' && StackNotEmpty(myStack) && StackTop(myStack, &c) && c != '(') { printf("左右括号配对次序不正确!\n"); return;} else if(exp[i] == ']' && StackNotEmpty(myStack) && StackTop(myStack, &c) && c == '[') StackPop(&myStack, &c); else if(exp[i] == ']' && StackNotEmpty(myStack) && StackTop(myStack, &c) && c != '[') { printf("左右括号配对次序不正确!\n"); return;}
else if(expli]=='&& StackNotEmpty(my Stack) && StackTop( myStack,&c)&匙c三=’{) StackPop ( &my Stack, &c) else if(exp[i]==''&& StackNotEmpty(myStack) & StackTop(my Stack, &c)&&c!='t) printf("左右括号配对次序不正确!\n"); return;} else if((exp[i]=’)’)‖|(exp[i]==’])|1 (expli]=='))&&! Stack NotEmpty(myStack)) printf("右括号多于左括号!n"); return;}
4 else if(exp[i] == '}' && StackNotEmpty(myStack) && StackTop(myStack, &c) && c == '{') StackPop(&myStack, &c); else if(exp[i] == '}' && StackNotEmpty(myStack) && StackTop(myStack, &c) && c != '{') {printf("左右括号配对次序不正确!\n");return;} else if(((exp[i] == ')') || (exp[i] == ']') || (exp[i] == '}')) && !StackNotEmpty(myStack)) { printf("右括号多于左括号!\n"); return;} }
if( Stack NotEmpty(myStack)) printf("左括号多于右括号!n") else printf("左右括号匹配正确!Ⅶn")
5 if(StackNotEmpty(myStack)) printf("左括号多于右括号!\n"); else printf("左右括号匹配正确!\n"); }