问题分析

  1. 要检查表达式中左右圆括号是否匹配,只需关注括号字符(其他字符可忽略):
    • 每个左括号 ( 必须有对应的右括号 )

    • 括号必须正确嵌套(不能交叉)

    • 错误检测

      • 遇到右括号时栈为空 → 多余右括号
      • 遍历结束后栈非空 → 多余左括号

算法设计

  1. 初始化:创建空栈存储左括号
  2. 遍历字符(直到 @):
    • 左括号 ( → 压入栈
    • 右括号 )
      • 栈空 → 立即失败(多余右括号)
      • 栈非空 → 弹出栈顶(完成匹配)
    • 其他字符 → 忽略
  3. 最终检查
    • 栈空 → 所有括号匹配
    • 栈非空 → 有未匹配左括号

代码实现

#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个)
    • 最坏情况:所有左括号连续出现(如"((((..."