括号匹配的检验
描述:
假设一个表达式或一段程序中含有三种括号:圆括号“(”和“)”、方括号“[”和“]”、花括号“{”和“}”。试写一个程序判别给定的表达式或程序中所含括号是否正确配对出现。
输入说明:
多组输入数据,第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
括号匹配是栈(Stack)的一个经典应用
下面是我用调用C++函数的方法完成本题的代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<string> 4 #include<stack> //包含栈的头文件 5 using namespace std; 6 int main() 7 { 8 int n; 9 cin>>n; 10 getchar(); //cin不会丢弃输入流中的换行符,getchar()函数用来接收n后面的换行符 11 while(--n) 12 { 13 stack<char> s; 14 string str; 15 getline(cin,str); //读取一行存放到str中,读取时会自动丢弃换行符 16 for(int i=0;i<str.size();i++) 17 { 18 char st=str[i]; 19 if(st=='('||st==')'||st=='['||st==']'||st=='{'||st=='}') 20 { 21 if(st=='('||st=='['||st=='{') 22 s.push(st); 23 else if(st==')') 24 if(s.top()=='(') s.pop(); else break; 25 else if(st==']') 26 if(s.top()=='[') s.pop(); else break; 27 else 28 if(s.top()=='{') s.pop(); else break; 29 } 30 } 31 s.empty() ? cout<<"right"<<endl : cout<<"wrong"<<endl; 32 } 33 return 0; 34 }
******
也可以自己实现栈的功能,下面是我用C++实现的栈解决本题的代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 6 #define stacksize 100 7 struct stack{ 8 char strstack[stacksize]; 9 int top; 10 }; 11 12 void InitStack(stack &s){ //定义一个新栈,初始化栈顶为-1 13 s.top=-1; 14 } 15 16 char Push(stack &s,char a){ 17 if(s.top==stacksize-1) //判断栈是否已满,若栈满返回0,不进行入栈操作 18 return 0; 19 s.top++; //栈顶指针指向下一个存储单元 20 s.strstack[s.top]=a; //入栈操作 21 return a; //返回入栈的字符 22 } 23 24 char Pop(stack &s){ 25 if(s.top==-1) //判断栈是否为空,若为空返回0;不进行出栈操作 26 return 0; 27 char a=s.strstack[s.top];//栈顶元素赋给a 28 s.top--; //栈顶指针移向前一个存储单元 29 return a; //返回出栈的字符串 30 } 31 32 int Empty(stack &s){ //判断栈是否为空,栈空返回1,不空返回0 33 if(s.top==-1) 34 return 1; 35 else 36 return 0; 37 } 38 39 int Check(char* str){ //判断字符串str是否匹配 40 stack s; //声明一个栈 41 InitStack(s); //初始化栈 42 int strn=strlen(str); 43 for(int i=0;i<strn;i++) 44 { 45 char a=str[i]; 46 switch (a){ 47 case '(': 48 case '[': 49 case '{': 50 Push(s,a); 51 break; 52 case ')': 53 if(Pop(s)!='(') 54 return 0; 55 break; 56 case ']': 57 if(Pop(s)!='[') 58 return 0; 59 break; 60 case '}': 61 if(Pop(s)!='{') 62 return 0; 63 break; 64 } 65 } 66 return Empty(s); //返回栈是否为空,返回1则说明str匹配,返回0说明不匹配 67 } 68 69 int main() 70 { 71 int n; 72 cin>>n; 73 while(n--) 74 { 75 char str[100]; 76 cin>>str; 77 int re=Check(str); 78 re==1 ? cout<<"right"<<endl : cout<<"wrong"<<endl; 79 } 80 return 0; 81 }
******