当前位置 博文首页 > 可惜浅灰的博客:stack应用:洛谷 P1739 表达式括号匹配
题目描述:
? ??假设一个表达式有英文字母(小写)、运算符(+,—,*,/)和左右小(圆)括号构成,以“@”作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则返回“YES”;否则返回“NO”。表达式长度小于255,左圆括号少于20个。
? ? 输入:表达式
? ? 输出:”YES" or "NO"
解题思路:
? ? 按字符逐个遍历输入的字符串,不匹配有两种情况:
1、在遍历中左右括号数量一致时,不能直接出现右括号;
2、当遍历结束时,不能有没匹配上的左括号。
定义一个栈,用于存储在遍历中没有匹配上的左括号的个数,有栈中元素类型和值都不重要,遇到左括号使元素入栈;遇到右括号使元素出栈;栈空表示目前的左右括号匹配无误。
#include <iostream>
using namespace std;
#include <stack>
#include <string>
void solve(const string input)
{
stack<int> s;
for (int i = 0; i < input.length(); i++)
{
if (s.empty() && input[i] == ')')
{
cout << "NO" << endl;
break;
}
if (input[i] == '(')
{
s.push(1);
}
else if (input[i] == ')')
{
s.pop();
}
else if (input[i] == '@')
{
break;
}
else
{
continue;
}
}
if (s.empty())
{
cout << "YES" << endl;
}
else
{
cout << "NO" << endl;
}
}
int main()
{
string input;
cin >> input;
solve(input);
return 0;
}
cs