T229223 括号匹配问题

题目描述

小明学习编译原理,自己设计了这样一个问题:给定一个表达式,由英文字母(小写)、运算符(+,—,*,/+/)和左右小括号构成,以“@”作为表达式的结束符。小明的目标是要编写一个程序检查表达式中的左右小括号是否匹配。若匹配,返回“YES”;否则,返回“NO”。假设表达式的长度小于255,左小括号"("少于20个。

输入格式

一行:一个字符串,表示表达式

输出格式

一行:“YES” 或“NO”

输入输出样例

输入 #1
2*(x+y)/(1-x)@
输出 #1
YES
输入 #2
(25+x)*(a*(a+b+b)@
输出 #2
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;
}

posted @ 2022-03-10 10:07  syxw  阅读(40)  评论(0编辑  收藏  举报