题目描述
请写一个程序,判断给定表达式中的括号是否匹配,表达式中的合法括号为”(“, “)”, “[", "]“, “{“, ”}”,这三个括号可以按照任意的次序嵌套使用。
输入
有多个表达式,输入数据的第一行是表达式的数目,每个表达式占一行。
输出
对每个表达式,若其中的括号是匹配的,则输出”yes”,否则输出”no”。
样例输入 Copy
4 [(d+f)*{}] [(2+3)) ()} [4(6]7)9
样例输出 Copy
yes no no no
这个题目应用栈的结构特点很容易做出来。因为根据输入的字符串
- 从左到右把(,{,[三种字符入栈
- 在此过程中,如果遇到),},]就和栈顶元素匹配,如果匹配成功,就取出栈顶元素,继续操作1,2,知道字符串遍历完。如果不能匹配,则返回false
- 如果字符串已经遍历完,栈空,则返回true,否则返回false
#include<cstdio> #include<stack> #include<string> #include<iostream> using namespace std; stack<char> s; bool match(string str) { for(int i=0;i<str.length();i++) { if(str[i]=='('||str[i]=='['||str[i]=='{') s.push(str[i]); if(str[i]==')'||str[i]==']'||str[i]=='}') { if(str[i]==')') { if(!s.empty()&&s.top()=='(') s.pop(); else return false; } else if(str[i]==']') { if(!s.empty()&&s.top()=='[') s.pop(); else return false; } else { if(!s.empty()&&s.top()=='{') s.pop(); else return false; } } } if(s.empty()) return true; return false; } int main() { int m; scanf("%d",&m); getchar(); while(m--) { string str; getline(cin,str); while(!s.empty()) s.pop(); if(match(str)) printf("yes\n"); else printf("no\n"); } return 0; }