一.题目描述
假设一个表达式或一段程序中含有三种括号:圆括号“(”和“)”、方括号“[”和“]”、花括号“{”和“}”。试写一个程序判别给定的表达式或程序中所含括号是否正确配对出现。
输入说明:
多组输入数据,第1行为1个正整数n,表明有n组测试数据;其余n行为n组测试数据,每行为一个含有括号的表达式或一段程序。
输出说明:
对于每一组测试数据,输出一个right或wrong,表明正确匹配与否。
输入样例:
3
a=b+(c-d)*(e-f));
while (m<(a[8]+t) {m=m+1; t=t-1;}
b=a*(4+c)-c[i];
输出样例:
wrong
wrong
right
二.题目分析
左括号入栈,右括号匹配
三.代码
#include <stdio.h>
#include <stdlib.h>
#define MAX 50
int Match(char *str)
{
int i,top=0;
char stack[MAX];
for(i=0;str[i]!='\0';i++)
{
switch(str[i])
{
//若是左括号,进栈
case '(': stack[top++]=str[i];break;
case '[': stack[top++]=str[i];break;
case '{': stack[top++]=str[i];break;
//若是右括号,和当前栈顶括号匹配
case ')':if(top==0||stack[top-1]!='(') return 0;
top--;
break;
case ']':if(top==0||stack[top-1]!='[') return 0;
top--;
break;
case '}':if(top==0||stack[top-1]!='}') return 0;
top--;
break;
default : break;
}
}
//出现多余左括号
if(top)
return 0;
return 1;
}
int main()
{
char str[MAX];
while((scanf("%s",str)!=EOF))
{
if(Match(str))
printf("right\n");
else
printf("wrong\n");
}
return 0;
}