原题链接:https://www.luogu.org/problem/P1739
题目描述
假设一个表达式有英文字母(小写)、运算符(+,—,*,/)和左右小(圆)括号构成,以“@”作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则返回“YES”;否则返回“NO”。表达式长度小于255,左圆括号少于20个。
输入输出格式
输入格式:
一行:表达式
输出格式:
一行:“YES” 或“NO”
输入输出样例
输入样例#1:
2*(x+y)/(1-x)@
输出样例#1:
YES
输入样例#2:
(25+x)* (a* (a+b+b)@
输出样例#2:
NO
说明
时空限制:1000ms 125M
表达式长度小于255,左圆括号少于20个
思路:入门水题,可以用栈来做,也可以直接模拟。
第一种:栈
建立一个栈,每次碰到左括号就入栈,碰到右括号时,判断栈是否为空,如果栈为空,说明出现右括号在左括号左边的情况,直接输出“NO”后结束程序即可。等到全部读完,再次对栈判空,若栈为空则输出“YES”,若栈非空则多了左括号,输出“NO”。
代码如下:
#include <iostream>
#include <cstdio>
#include <stack>
using namespace std;
int main()
{
stack<char> zhan; //定义一个char类型的空栈
char ch;
while((ch=getchar())!='@') //当读入的字符不为'@'
{
if(ch=='(') //如果是'(',入栈
zhan.push(ch);
else if(ch==')') //如果是')'
{
if(!zhan.empty()) //当栈不为空,'('出栈
zhan.pop();
else //如果栈为空,说明')'在'('左边
{
cout<<"NO"<<endl;
return 0;
}
}
}
if(!zhan.empty()) //最后栈不为空,则不符
cout<<"NO"<<endl;
else
cout<<"YES"<<endl;
return 0;
}
第二种:模拟
遍历一遍字符串,遇到左括号sum +1,遇到右括号sum -1,如果sum出现了负数,说明右括号出现在了左括号左边,直接输出NO,最后如果sum==0,说明左右括号匹配。
代码如下:
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int main()
{
int i,sum=0;
char s[260];
scanf("%s",s);
int len=strlen(s); //确定字符串长度
for(i=0;i<len;i++) //遍历字符串
{
if(s[i]=='@') //如果遇到"@",则结束
break;
if(s[i]=='(') //遇到"(" ,sum加1
sum++;
else if(s[i]==')') //遇到")",sum减1
sum--;
if(sum<0) //sum小于0,表示右括号出现在左括号左边,跳出循环
break;
}
if(sum==0) //sum等于0才符合情况
printf("YES\n");
else
printf("NO\n");
return 0;
}