括号匹配的检验
描述:
假设一个表达式或一段程序中含有三种括号:圆括号"("和")"、方括号"["和"]"、花括号"{"和"}"。试写一个程序判别给定的表达式或程序中所含括号是否正确配对出现。
输入说明:
每行为一个含有括号的表达式或一段程序。
输出说明:
输出一个right或wrong,表明正确匹配与否。
输入样例:
while (m<(a[8]+t) {m=m+1; t=t-1;}
输出样例:
wrong
提示
用栈来实现
小粥做只做了十五分钟,但交了......又一个十五分钟!!!!!!因为没有正确理解flag==1&&top==-1这两个为什么需要同时满足才能输出right
思路:很简单,利用栈FILO的性质做就行,很典型的栈的例子,暑假学的留下的一米米印象里面,这个尤其深刻
代码:
1 #include<stdio.h>
2 int main()
3 {
4 char c;
5 char stack[100];
6 int top=-1;
7 int flag=1;
8 while(1)
9 {
10 scanf("%c",&c);
11 if(c=='{'||c=='['||c=='(') stack[++top]=c;
12
13 else if(c=='}'||c==']'||c==')')
14 {
15 if(c=='}')
16 {
17 if(stack[top]=='{') stack[top--]=NULL;
18 else { flag=0; break;
19 }
20 }
21 else if(c==']')
22 {
23 if(stack[top]=='[') stack[top--]=NULL;
24 else { flag=0; break;
25 }
26 }
27 else if(c==')')
28 {
29 if(stack[top]=='(') stack[top--]=NULL;
30 else {flag=0; break;
31 }
32 }
33 }
34 if(c=='\n') break;
35 }
36
37 if(top==-1&&flag==1) printf("right\n");
38 else printf("wrong\n");
39 return 0;
40 }
Attention:
关于37行的红字
1.top==-1,表示栈已空;flag==1,表示匹配成功;
2.小粥犯的错:
第一次只写了flag ==1,那么 {【()】 这种情况也会输出yes(匹配成功但还有剩下的左括号)
第二次只写了top==-1(苯苯的,固执地觉得不用两个条件都满足),那么{【()】}】 这种情况也输出yes(右括号多了但栈空)