洛谷-P1739 表达式括号匹配 题解

题目链接:https://www.luogu.com.cn/problem/P1739

题目解析

  • 输入是一个由小写字母、运算符(+ - * /)、左右括号 () 和结束符 @ 组成的字符串。
  • 只需关注 圆括号的匹配性,其他字符(包括字母、运算符、@)均可忽略。
  • 匹配规则:每个 ) 必须有其前面未匹配的 ( 与之对应;最终不能有多余的 ( 或 )。

示例:

  • (a+b) → YES
  • ((a+b) → NO(多一个左括号)
  • a+b) → NO(右括号无匹配)

核心思想

  • 遍历字符串中的每个字符:遇到 (:入栈;遇到 ):若栈为空 → 多余的右括号,直接输出 NO 并退出;否则弹出一个 ((表示匹配成功);
  • 遍历结束后,若栈为空 → 所有括号都匹配,输出 YES;否则输出 NO

注意:题目中 @ 仅为结束标志,不影响逻辑,可当作普通字符处理(代码中无需特殊判断)。

代码详解(C++)

#include <iostream>
#include <string>
#include <stack>
using namespace std;

int main() {
    string str;
    cin >> str;               // 读入整个表达式(含 @)
    stack<char> S;

    for (char ch : str) {
        if (ch == '(') {
            S.push(ch);       // 左括号入栈
        } else if (ch == ')') {
            if (S.empty()) {  // 右括号出现时栈空 → 不匹配
                cout << "NO";
                return 0;     // 立即退出
            }
            S.pop();          // 匹配成功,弹出对应左括号
        }
        // 其他字符(字母、运算符、@)全部忽略
    }

    // 最后检查是否还有未匹配的左括号
    if (S.empty())
        cout << "YES";
    else
        cout << "NO";

    return 0;
}

复杂度分析

  • 时间复杂度:O(n),其中 n 是字符串长度(< 255),每个字符访问一次。
  • 空间复杂度:O(k),k为左括号数量(< 20),栈最大深度很小。

全部评论

相关推荐

11-26 10:15
门头沟学院 Java
1.&nbsp;项目介绍2.&nbsp;具体展开介绍一个有挑战/有亮点的项目3.&nbsp;项目中记忆深刻的难点4.&nbsp;项目细节的问答(大概7个问题,20分钟)5.&nbsp;手撕题:1047&nbsp;删除字符串中的所有相邻重复项,问有无其他方案6.&nbsp;手撕题:两个简单sql(一个group&nbsp;by,一个join&nbsp;in、子查询两个方案)7.&nbsp;JDK&nbsp;的版本是多少?JDK&nbsp;17、21的新特性是什么8.&nbsp;创建一个线程池的方法?Executors能创建哪些线程池9.&nbsp;核心线程数是什么意思?10.&nbsp;阻塞队列是做什么?阻塞队列有可能会满吗?11.&nbsp;如果我不想让阻塞队列满,一直往阻塞队列里面加,这种情况下可以实现吗?12.&nbsp;阻塞队列满了之后把后面的新请求丢弃掉,这种可以实现吗?13.&nbsp;首先核心线程数设置为5,任务都在核心线程上去执行,假如核心线程满了之后,希望说新请求继续创建新的线程去执行,然后一直到满足最大线程数的阈值之后,后续再来新的请求丢进阻塞队列里去等待。这种可以实现吗?14.&nbsp;JVM,包括垃圾回收这块,了解得多吗15.&nbsp;spring&nbsp;版本是多少16.&nbsp;A类有A1方法,B类有B1、B2方法,A类中注入B类。spring&nbsp;里的一个调用链:请求先请求到&nbsp;A1&nbsp;方法,&nbsp;A1&nbsp;内部又调用了&nbsp;B1&nbsp;方法,&nbsp;B1内部又调用到&nbsp;B2&nbsp;方法,内部都没有异常。transactional注解加在B1方法上,哪些函数内部的数据库操作会包裹在事务里面去执行?如果加在B2方法上呢?17.&nbsp;MySQL用的是哪个版本18.&nbsp;select&nbsp;from&nbsp;score&nbsp;where&nbsp;student&nbsp;id=1&nbsp;for&nbsp;update。数据库引擎是InnoDB,隔离级别也是默认的隔离级别,现在会加什么锁?假设条件改成不等于1呢?
点赞 评论 收藏
分享
12-04 16:19
已编辑
东华理工大学 前端工程师
解zj:但是想想也挺好的 这么多天也面了挺多家公司 也越来越有感觉了 希望明天能有一个好的结果
投递字节跳动等公司7个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务