Description
给一个长度不大于100的字符串,问该字符串里出现的括号是否合法。
字符串只会出现三种括号,“[]”,“()”,“{}”,且形如“({[]})”为合法,形如“[(])”为不合法。
Input
单组数据。
长度不大于100的字符串,字符串中不存在空格。
Output
如果该字符串中出现的所有括号都合法,输出“Yes”,否则输出“No”。
Sample Input
(a+b)!=cSample Output
Yes
解题思路:
实际上是判断括号是否对称,可以用一个栈来实现。
遇到左括号时全部压入栈,遇到右括号时,先判断该右括号和栈顶元素是不是一组匹配的括号,比如右括号是"(",则匹配的栈顶元素应该是")"
如果匹配的话,栈顶元素(左括号)出栈,右括号不做处理并读取下一个字符
当循环处理完毕之后,如果栈是空的,那么括号就是匹配的。
有一种栈不为空的情况需要注意一下:
例如“([])]” ,前4个字符已经将栈清空了,但是仍然有右括号想要进栈,需要在if语句中判断一下
#include<iostream>
#include<stack>
#include<map>
using namespace std;
int main()
{
stack <char>s;
map<int, int>m;
m['('] = 1; m[')'] = 1;
m['['] = 2; m[']'] = 2;
m['{'] = 3; m['}'] = 3;
string str;
cin >> str;
int len = str.size();
for (int i = 0; i < len; i++)
{
char c = str[i];
if (c == '(' || c == '{' || c == '[') s.push(c);
else if (c == ')' || c == '}' || c == ']')
{
//分为两种情况,是可以直接判断不匹配的 ①栈已经为空,但是仍然有右括号要进栈 ②右括号与栈顶的左括号不匹配时
if (s.empty() || m[c] != m[s.top()])
{
cout << "No" << endl;
return 0;
}
else if (m[c] == m[s.top()])
{
s.pop();
}
}
}
//如果所有符号都处理完毕,栈仍然不为空(栈中存在左括号),也是不匹配的
if (s.empty()) cout << "Yes" << endl;
else cout << "No" << endl;
return 0;
}