一个表达式有由英文字母(小写)、运算符(+,—,*,/)和左右小(圆)括号构成,以“@”作为表达式的结束符。
检查表达式中的左右圆括号是否匹配,若匹配,则返回“YES”;否则返回“NO”。
表达式长度小于255,左圆括号少于20个。
示例一:
输入:2*(x+y)/(1-x)@
输出:YES
解释:对应括号匹配
示例二:
输入:(25+x)* (a*(a+b+b)@
输出:NO
解释:第2个左括号没有对应的右括号
思路:
当遇到 '( '时,放入第一个栈中
当遇到 ‘)’ 时,先判断第一个栈不为空且栈顶元素是 ‘(’ ,弹出第一个栈的栈顶元素代表这2个括号匹配 牵手 成功,如果第一个栈为空时,把 ‘)’ 放入第二个栈中,继续循环。
遇到其他符号忽略即可。
最后的判断要保证存放左括号的栈和存放右括号的栈都为空才是都匹配成功,如果有一个栈不为空,那么说明没有成功。
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#include<stack>
#include<queue>
using namespace std;
int a[101]={0};
int main(){
string str;
cin>>str;
stack<char> s,st;
int n=str.length();
for(int i=0;i<n;++i){
if(str[i]=='('){
s.push(str[i]);
}
else if(str[i]==')'){
if(!s.empty()&&s.top()=='(')
s.pop();
else
st.push(')');
}
}
if(s.empty()&&st.empty())
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
return 0;
}