问题分析
- 要检查表达式中左右圆括号是否匹配,只需关注括号字符(其他字符可忽略):
-
每个左括号
(必须有对应的右括号) -
括号必须正确嵌套(不能交叉)
-
错误检测:
- 遇到右括号时栈为空 → 多余右括号
- 遍历结束后栈非空 → 多余左括号
-
算法设计
- 初始化:创建空栈存储左括号
- 遍历字符(直到
@):- 左括号
(→ 压入栈 - 右括号
):- 栈空 → 立即失败(多余右括号)
- 栈非空 → 弹出栈顶(完成匹配)
- 其他字符 → 忽略
- 左括号
- 最终检查:
- 栈空 → 所有括号匹配
- 栈非空 → 有未匹配左括号
代码实现
#include <iostream>
#include <stack> // 必须包含栈容器头文件
using namespace std;
int main() {
stack<char> s; // 创建字符栈,用于存储左括号
char ch;
// 逐字符读取输入,直到遇到结束符@
while (cin.get(ch) && ch != '@') {
// 处理左括号:压入栈
if (ch == '(') {
s.push(ch);
}
// 处理右括号:尝试匹配
else if (ch == ')') {
// 关键检查1:栈为空说明没有匹配的左括号
if (s.empty()) {
cout << "NO" << endl;
return 0; // 立即终止程序
}
// 匹配成功:弹出对应的左括号
s.pop();
}
// 其他字符(字母/运算符)直接忽略
}
// 关键检查2:遍历结束后栈必须为空
if (s.empty()) {
cout << "YES" << endl;
} else {
cout << "NO" << endl;
}
return 0;
}
复杂度分析
- 时间复杂度:O(n)
- n 为表达式长度(<255)
- 每个字符仅处理一次
- 栈操作(push/pop/empty)均为 O(1)
- 空间复杂度:O(m)
- m 为最大嵌套深度(<20,题目约束左括号<20个)
- 最坏情况:所有左括号连续出现(如
"((((...")

京公网安备 11010502036488号