第一期day3
题目链接
7.23:P1739 表达式括号匹配
题目大意
- 假设一个表达式有英文字母(小写)、运算符(+,—,*,/)和左右小(圆)括号构成,以“@”作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则返回“YES”;否则返回“NO”。表达式长度小于255,左圆括号少于20个。
输入
一行:表达式
输出
一行:“YES” 或“NO”
思路
一开始觉得括号匹配,那么只要左括号数和右括号数相等就行,然后发现部分正确,想了一下应该是这种情况 )(,那么也是不匹配的情况,然后就使用一个flag变量来判断,当有左括号时就+1,当有右括号就-1,那么如果是匹配的,最终肯定为0,问题就在于如何判断右括号早于左括号出现,前面说到有左括号便会+1,那么只要 flag不为0,则右括号就是正常出现的,则-1,若 flag为0,说明此时右括号的出现早于左括号,那么就不对 flag做任何改变,这样最终就成不了0;
AC代码
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
string str;
cin >> str;
int left = 0, right = 0;
int flag = 0;
for (int i = 0; i < 10000; i++)
{
if (str[i] == '(')
{
left++;
flag++;
}
else if (str[i] == ')')
{
right++;
if(flag!=0)
flag--;
}
else if (str[i] == '@')
break;
}
if (left == right && flag == 0)
cout << "YES" << endl;
else
cout << "NO" << endl;
return 0;
}