c/c++蓝桥杯经典编程题100道(18)括号匹配

括号匹配

->返回c/c++蓝桥杯经典编程题100道-目录


目录

括号匹配

一、题型解释

二、例题问题描述

三、C语言实现

解法1:栈匹配法(难度★)

解法2:计数器法(仅限单一括号类型,难度★☆)

四、C++实现

解法1:使用STL栈(难度★)

解法2:哈希表优化(难度★★)

五、总结对比表

六、特殊方法与内置函数补充

1. C语言中的动态栈

2. C++的 unordered_map

3. 递归解法(不推荐)


一、题型解释

括号匹配是验证字符串中的括号是否正确闭合的问题。常见题型:

  1. 基础匹配:验证字符串中的 ()[]{} 是否成对且顺序正确。

  2. 包含其他字符:字符串中混合其他字符(如字母、数字),需跳过非括号字符。

  3. 最长有效括号子串:找到字符串中最长的有效括号子串长度。

  4. 最小添加次数:计算使括号匹配所需最少添加的括号数量。


二、例题问题描述

例题1:输入 "()[]{}",输出 true(所有括号正确匹配)。
例题2:输入 "{[()]}",输出 true(嵌套括号正确匹配)。
例题3:输入 "(]",输出 false(括号类型不匹配)。
例题4:输入 "()(()",输出最长有效子串长度 2


三、C语言实现

解法1:栈匹配法(难度★)

通俗解释

  • 像叠盘子一样,遇到左括号“放入盘子”,遇到右括号时检查最上面的盘子是否匹配。

c

#include <stdio.h>
#include <stdbool.h>
#include <string.h>

#define MAX_SIZE 10000

bool isValid(char *s) {
    char stack[MAX_SIZE]; // 用数组模拟栈
    int top = -1;         // 栈顶指针
    for (int i = 0; s[i] != '\0'; i++) {
        char c = s[i];
        if (c == '(' || c == '[' || c == '{') { // 左括号入栈
            stack[++top] = c;
        } else { // 右括号检查匹配
            if (top == -1) return false; // 栈为空,无法匹配
            char topChar = stack[top--];
            if ((c == ')' && topChar != '(') || 
                (c == ']' && topChar != '[') || 
                (c == '}' && topChar != '{')) {
                return false;
            }
        }
    }
    return top == -1; // 栈必须为空才完全匹配
}

int main() {
    printf("%d\n", isValid("()[]{}")); // 输出 1(true)
    printf("%d\n", isValid("([)]"));    // 输出 0(false)
    return 0;
}

代码逻辑

  1. 栈初始化:数组 stack 模拟栈,top 表示栈顶索引。

  2. 遍历字符

    • 左括号:入栈,top 加1。

    • 右括号:若栈为空直接失败;否则弹出栈顶元素检查是否匹配。

  3. 最终检查:遍历结束后栈必须为空,否则存在未闭合的左括号。


解法2:计数器法(仅限单一括号类型,难度★☆)

通俗解释

  • 统计左右括号数量,左括号加1,右括号减1,中途不能为负,最终必须归零(仅适用于单一括号类型,如纯 ())。

c

bool isValidSingleType(char *s) {
    int balance = 0;
    for (int i = 0; s[i] != '\0'; i++) {
        if (s[i] == '(') balance++;
        else if (s[i] == ')') balance--;
        if (balance < 0) return false; // 中途右括号过多
    }
    return balance == 0;
}

int main() {
    printf("%d\n", isValidSingleType("(()())")); // 输出 1
    printf("%d\n", isValidSingleType("())"));    // 输出 0
    return 0;
}

代码逻辑

  1. 平衡计数器:遇到左括号加1,右括号减1。

  2. 中途检查:计数器不能为负(右括号比左括号多)。

  3. 最终检查:计数器归零。

  4. 局限性:无法处理混合括号类型(如 [))。


四、C++实现

解法1:使用STL栈(难度★)

通俗解释

  • 使用C++标准库的 stack 容器,简化栈操作。

cpp

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

bool isValid(string s) {
    stack<char> st;
    for (char c : s) {
        if (c == '(' || c == '[' || c == '{') { // 左括号入栈
            st.push(c);
        } else {
            if (st.empty()) return false; // 栈为空,无法匹配
            char topChar = st.top();
            st.pop();
            if ((c == ')' && topChar != '(') || 
                (c == ']' && topChar != '[') || 
                (c == '}' && topChar != '{')) {
                return false;
            }
        }
    }
    return st.empty(); // 栈必须为空
}

int main() {
    cout << boolalpha; // 输出true/false而非1/0
    cout << isValid("{[()]}") << endl; // 输出 true
    cout << isValid("([)]") << endl;   // 输出 false
    return 0;
}

代码逻辑

  • 与C语言栈方法逻辑相同,但使用 stack<char> 简化栈操作。


解法2:哈希表优化(难度★★)

通俗解释

  • 使用哈希表存储括号对,简化条件判断。

cpp

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

bool isValidHash(string s) {
    stack<char> st;
    unordered_map<char, char> pairs = {
        {')', '('}, {']', '['}, {'}', '{'}
    };
    for (char c : s) {
        if (pairs.find(c) == pairs.end()) { // 左括号入栈
            st.push(c);
        } else { // 右括号检查匹配
            if (st.empty() || st.top() != pairs[c]) return false;
            st.pop();
        }
    }
    return st.empty();
}

int main() {
    cout << isValidHash("()[]{}") << endl; // 输出 true
    return 0;
}

代码逻辑

  1. 哈希表存储映射:键为右括号,值为对应的左括号。

  2. 简化条件判断:遇到右括号时,直接从哈希表取对应的左括号进行比较。


五、总结对比表

方法时间复杂度空间复杂度优点缺点
栈匹配法O(n)O(n)支持所有括号类型需要额外空间
计数器法O(n)O(1)空间高效仅支持单一括号类型
STL栈O(n)O(n)代码简洁依赖STL库
哈希表优化O(n)O(n)代码可读性高需理解哈希表

六、特殊方法与内置函数补充

1. C语言中的动态栈

  • 实现方式:使用动态数组 (malloc 和 realloc) 实现栈,避免固定大小限制。

2. C++的 unordered_map

  • 作用:快速查找键值对,用于括号映射关系。

3. 递归解法(不推荐)

  • 局限性:递归深度与括号嵌套层数相关,可能导致栈溢出。

->返回c/c++蓝桥杯经典编程题100道-目录

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/968160.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

(定时器,绘制事件,qt简单服务器的搭建)2025.2.11

作业 笔记&#xff08;复习补充&#xff09; 1> 制作一个闹钟软件 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPushButton> //按钮类 #include <QTimer> //定时器类 #include <QTime> //…

STM32_USART通用同步/异步收发器

目录 背景 程序 STM32浮空输入的概念 1.基本概念 2. STM32浮空输入的特点 3. STM32浮空输入的应用场景 STM32推挽输出详解 1. 基本概念 2. 工作原理 3. 应用场景 使能外设时钟 TXE 和 TC的区别 USART_IT_TXE USART_IT_TC 使能串口外设 中断处理函数 背景 单片…

大语言模型多代理协作(MACNET)

大语言模型多代理协作(MACNET) Scaling Large-Language-Model-based Multi-Agent Collaboration 提出多智能体协作网络(MACNET),以探究多智能体协作中增加智能体数量是否存在类似神经缩放定律的规律。研究发现了小世界协作现象和协作缩放定律,为LLM系统资源预测和优化…

安川伺服控制器MP系列优势特点及行业应用

在工业自动化领域&#xff0c;运动控制器的性能直接决定了设备的精度、效率和可靠性。作为全球领先的运动控制品牌&#xff0c;安川电机伺服控制器凭借其卓越的技术优势和广泛的应用场景&#xff0c;正在为智能制造注入强劲动力&#xff01; MP3100&#xff1a;主板型运动控制…

AIoT时代来临,物联网技术如何颠覆未来生活?

在这个万物互联的时代&#xff0c;“物联网”&#xff08;IoT&#xff09;正以前所未有的速度改变我们的生活&#xff0c;而“AIoT”则是在物联网基础上融入人工智能技术&#xff0c;赋予设备更高的智能和自主决策能力。随着5G、边缘计算和云技术的不断发展&#xff0c;物联网正…

2025.2.11

1> 制作一个闹钟软件 .h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QLabel> #include <QLineEdit> #include <QPushButton> #include <QTime> #include <QTimer> #include <QTimeEdit> #include <QDa…

安装OpenJDK21(linux、macos)

文章目录 安装OpenJDK21java21linux下安装配置mac下安装 安装OpenJDK21 java21 封神&#xff01;Java 21正式发布了&#xff0c;迎来了史诗级新特性&#xff0c;堪称版本最强&#xff01;&#xff01;&#xff01; 视频链接&#xff1a;https://www.bilibili.com/video/BV1E8…

PortSwigger——WebSockets vulnerabilities

文章目录 一、WebSockets二、Lab: Manipulating WebSocket messages to exploit vulnerabilities三、Lab: Manipulating the WebSocket handshake to exploit vulnerabilities四、Using cross-site WebSockets to exploit vulnerabilities4.1 跨站WebSocket劫持&#xff08;cro…

SpringBootWeb三层架构分层解耦

SpringBootWeb 1. SpringBootWeb案例1.1 控制层未拆分代码1.2 实体类1.3 静态资源文件1.4 txt文件1.5 运行界面展示 2. 三层架构拆分2.1 控制层&#xff08;Controller&#xff09;2.1.1 功能2.1.2 用户信息控制层 2.2 业务逻辑层&#xff08;Service&#xff09;2.2.2 功能2.2…

Kimi k1.5: Scaling Reinforcement Learning with LLMs

TL;DR 2025 年 kimi 发表的 k1.5 模型技术报告&#xff0c;和 DeepSeek R1 同一天发布&#xff0c;虽然精度上和 R1 有微小差距&#xff0c;但是文章提出的 RL 路线也有很强的参考意义 Paper name Kimi k1.5: Scaling Reinforcement Learning with LLMs Paper Reading Note…

1.攻防世界 unserialize3(wakeup()魔术方法、反序列化工作原理)

进入题目页面如下 直接开审 <?php // 定义一个名为 xctf 的类 class xctf {// 声明一个公共属性 $flag&#xff0c;初始值为字符串 111public $flag 111;// 定义一个魔术方法 __wakeup()// 当对象被反序列化时&#xff0c;__wakeup() 方法会自动调用public function __wa…

Web前端开发--HTML

HTML快速入门 1.新建文本文件&#xff0c;后缀名改为.html 2.编写 HTML结构标签 3.在<body>中填写内容 HTML结构标签 特点 1.HTML标签中不区分大小写 2.HTML标签属性值中可以使用单引号也可使用双引号 3.HTML语法结构比较松散&#xff08;但在编写时要严格一点&…

JVM(Java 虚拟机)

Java语言的解释性和编译性&#xff08;通过JVM 的执行引擎&#xff09; Java 代码&#xff08;.java 文件&#xff09;要先使用 javac 编译器编译为 .class 文件&#xff08;字节码&#xff09;&#xff0c;紧接着再通过JVM 的执行引擎&#xff08;Execution Engine&#xff09…

Unity3D实现显示模型线框(shader)

系列文章目录 unity工具 文章目录 系列文章目录👉前言👉一、效果展示👉二、第一种方式👉二、第二种方式👉壁纸分享👉总结👉前言 在 Unity 中显示物体线框主要基于图形渲染管线和特定的渲染模式。 要显示物体的线框,通常有两种常见的方法:一种是利用内置的渲染…

java项目之直销模式下家具工厂自建网站源码(ssm+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的直销模式下家具工厂自建网站源码。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 直销模式下家具…

window 安装GitLab服务器笔记

目录 视频&#xff1a; 资源&#xff1a; Linux CeneOS7&#xff1a; VMware&#xff1a; Linux无法安装 yum install vim -y 1.手动创建目录 2.下载repo PS 补充视频不可复制的代码 安装GitLab *修改root用户密码相关&#xff08;我卡在第一步就直接放弃了这个操作&…

笔记:理解借贷相等的公式

强烈推荐非会计人士&#xff0c;快速了解会计看这个系列的视频&#xff0c;其中比较烧脑的“借贷相等”公式&#xff0c;这个视频讲解的不错&#xff1a; 4.小白财务入门-借贷记账法_哔哩哔哩_bilibili 比如这里&#xff0c;钱在银行卡重&#xff0c;所以银行存款就是借方…

Qt - 地图相关 —— 3、Qt调用高德在线地图功能示例(附源码)

效果 作者其他相关文章链接:           Qt - 地图相关 —— 1、加载百度在线地图(附源码)           Qt - 地图相关 —— 2、Qt调用百度在线地图功能示例全集,包含线路规划、地铁线路查询等(附源码)           Qt - 地图相关 —— 3、Qt调用…

使用 POI-TL 和 JFreeChart 动态生成 Word 报告

文章目录 前言一、需求背景二、方案分析三、 POI-TL JFreeChart 实现3.1 Maven 依赖3.3 word模板设置3.2 实现代码 踩坑 前言 在开发过程中&#xff0c;我们经常需要生成包含动态数据和图表的 Word 报告。本文将介绍如何结合 POI-TL 和 JFreeChart&#xff0c;实现动态生成 W…

jenkins备份还原配置文件

下载ThinBackup插件 方式1 从插件市场直接下载 Manage Jenkins->Manage Plugins->可选插件搜索 注意&#xff1a;有时可能因为网络或者版本问题下载不了&#xff0c;好像是默认下载最新版本&#xff0c;可选择手动安装&#xff01; 方式二 手动安装插件 点击查看手…