T229223 括号匹配问题
题目描述
小明学习编译原理,自己设计了这样一个问题:给定一个表达式,由英文字母(小写)、运算符(+,—,*,/+,—,∗,/)和左右小括号构成,以“@”作为表达式的结束符。小明的目标是要编写一个程序检查表达式中的左右小括号是否匹配。若匹配,返回“YES”;否则,返回“NO”。假设表达式的长度小于255,左小括号"("少于20个。
输入格式
一行:一个字符串,表示表达式
输出格式
一行:“YES” 或“NO”
输入输出样例
2*(x+y)/(1-x)@
YES
(25+x)*(a*(a+b+b)@
NO
说明/提示
表达式长度小于255,“(”少于20个
还是先贴代码,思路等题目都做完了再补:(因为我还不会用这个编辑器的原因,我要是排版的话,复制这串代码就不能编译了(。。) 我先不排版试试复制下来能不能编译)
好 下一题 做得我要不行了 放一放先回来更新这题思路
这题思路还是比较简单的
就是运用栈
当输入遇到 (
的时候入栈
遇到 )
时删除栈顶元素
当结束输入时
栈里面没有元素,那么就说明是正确的
其中有一种特殊情况:
当栈中没有元素,即还没输入 '(' 时便输入了 ')' 这时也是错误的。
注意在命令行窗口里不要开中文输入法!
#include <iostream>
#include<stack>
#include<string>
using namespace std;
int main()
{
string A;
stack <char> StringA;
cin>>A;
bool P=false;
int lena=A.length();
for(int i=0;i<lena;i++){
if(A[i]=='('){
StringA.push(1);
}
if(A[i]==')'){
if(StringA.empty()){
cout<<"NO";
P=true;
break;
}
else{
StringA.pop();
}
}
}
if(P==false){
if(StringA.empty()){
cout<<"YES";
}
else{cout<<"NO";}
}
return 0;
}