题目描述
请写一个程序,判断给定表达式中的括号是否匹配,表达式中的合法括号为”(“, “)”, “[", "]“, “{“, ”}”,这三个括号可以按照任意的次序嵌套使用。
输入
有多个表达式,输入数据的第一行是表达式的数目,每个表达式占一行。
输出
对每个表达式,若其中的括号是匹配的,则输出”yes”,否则输出”no”。
样例输入
4
[(d+f)*{
}]
[(2+3))
()}
[4(6]7)9
样例输出
yes
no
no
no
思路:用stack以及map,通过map将”(“, “)”, “[", "]“, “{“, ”}”他们中的任何两个绑在一起。输入一个字符串后,如果字符串的元素是括号,则将其入栈,如果该括号正和栈顶元素是一对,则将栈顶元素出栈。最后,如果栈为空,则表示是合法的,若不为空,则不合法。
#include <iostream>
#include <string>
#include <stack>
#include <cstdio>
#include <map>
using namespace std;
int main()
{
int n,i,j;
string str;
stack<char> s;
map<char,char> mp;
//将括号们绑在一起
mp['(']=')';
mp['{']='}';
mp['[']=']';
mp[')']='(';
mp['}']='{';
mp[']']='[';
while(scanf("%d\n",&n)!=EOF){
for(i=0;i<n;i++){
getline(cin,str);
for(j=0;j<str.length();j++){
if(!s.empty()&&mp[s.top()]==str[j]){
//如果栈不为空且该字符为栈顶元素的好朋友
s.pop(); //则将栈顶元素出栈
continue; //且跳过以后的步骤
}
//如果是括号,则入栈
if(str[j]=='('||str[j]=='{'||str[j]=='['||str[j]==')'||str[j]=='}'||str[j]==']')
s.push(str[j]);
}
if(s.empty()) printf("yes\n"); //栈为空表示合法
else printf("no\n"); //栈不空表示非法
while(!s.empty()) s.pop(); //此时如果栈不空的话,栈中会有残留,应将栈置空
}
}
return 0;
}