1353:表达式括号匹配(stack)时间限制: 1000 ms 内存限制: 65536 KB 提交数: 14209 通过数: 7610 【题目描述】设一个表达式有英文字母(小写)、运算符(+,—,∗,/+,—,∗,/)和左右小(圆)括号构成,以“@@”作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则返回“YESYES”;否则返回“NONO”。表达式长度小于255255,左圆括号少于2020个。 【输入】一行数据,即表达式。 【输出】一行,即“YESYES” 或“NONO”。 【输入样例】 【输出样例】 【提示】【样例输入2】
【样例输出2】
|
教学备忘录:编辑 |
无 |
给学生提示:编辑 |
无 |
经典括号匹配问题,本题可忽略除( ) 外所有字符,仅看括号是否匹配。
遇到 ( 将其入栈,遇到 ) 判断栈是否为空,若栈为空则为NO,栈不为空弹出栈顶元素
注意输出内容是大写YES,不是Yes
#include <iostream>
#include <stack>
#include <cstdio>
#include <string>
using namespace std;
stack <int> s;
int main()
{
string str;
getline(cin, str);
int len = str.length(), cnt = 1;
for (int i = 0; i < len; i ++) {
if (str[i] == '(') {
s.push(str[i]);
}
if (str[i] == ')') {
if (s.empty()) {
//cout << "No" << endl;
cnt = 0; // 此处用cnt进行标记,但本题可以输出NO后直接return 0;
break;
}
else {
s.pop();
}
}
}
if (s.empty() && cnt != 0) {
cout << "YES" << endl;
}
else {
cout << "NO" << endl;
}
return 0;
}
用字符组模拟栈
#include <iostream>
#include <stack>
#include <cstdio>
#include <string>
using namespace std;
int main()
{
char s[1005];
string str;
getline(cin, str);
int len = str.length(), cnt = 1, tmp = 0;
for (int i = 0; i < len; i ++) {
if (str[i] == '(') {
s[tmp++] = str[i];
}
if (str[i] == ')') {
if (tmp == 0) {
//cout << "No" << endl;
cnt = 0; // 此处用cnt进行标记,但本题可以输出NO后直接return 0;
break;
}
else {
tmp --;
}
}
}
if (tmp == 0 && cnt != 0) {
cout << "YES" << endl;
}
else {
cout << "NO" << endl;
}
return 0;
}