题目描述
假设一个表达式有英文字母(小写)、运算符(+
、-
、*
、/
)和左右小(圆)括号构成,以 @
作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则输出 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 个。
思路:
用一个栈模拟,过程如下:
遍历字符串(其实不用管那个@)
当字符为左括号时:直接入栈
当字符为右括号时:
如果栈不为空且栈顶是左括号:栈顶元素出栈
否则:输出"NO",并结束程序
最后,判断栈是否为空
如果是的话,输出"YES"
否则,输出"NO"
AC代码(注释):
#include<bits/stdc++.h>//万能头文件
using namespace std;//cin,cout必备
stack <char> s;//定义一个栈
int main()//main主函数
{
string a;//定义字符串
getline(cin,a);//输入
for(int i=0;i<a.size();i++)//遍历
{
if(a[i]=='(')//是左括号
{
s.push(a[i]);//入栈
}
else if(a[i]==')')//是右括号
{
if(!s.empty()&&s.top()=='(')//栈非空且栈顶元素为左括号
{
s.pop();//出栈
}
else//不合法
{
cout<<"NO";//输出
return 0;//结束程序
}
}
}
s.empty()?cout<<"YES":cout<<"NO";//三元表达式
return 0;
}
小提示:这里用到了栈,有的Dev.c++编译器可能会报错,那怎么办呢?
首先,将鼠标移到“工具”选项(下方第7个)
然后,点击最上方的“编译选项”
弹出对话框,选择“在编译时加入以下命令”,在里面输入:-std=c++11,点击“确定”即可,注意不要打错,否则还是会报错!
此外,还有一些东西(如vector,map,set,queue,deque等)也可能会报错,报错时加上-std=c++11即可
大家学会了吗?学会了就点个赞吧!球球了!