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

news/2025/2/11 13:26:40/

括号匹配

->返回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 10000bool 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("(()())")); // 输出 1printf("%d\n", isValidSingleType("())"));    // 输出 0return 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/0cout << isValid("{[()]}") << endl; // 输出 truecout << isValid("([)]") << endl;   // 输出 falsereturn 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; // 输出 truereturn 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道-目录


http://www.ppmy.cn/news/1571164.html

相关文章

Windows 电脑安装 mysqldump 的详细教程

一、下载 MySQL 社区版 访问官网 打开浏览器&#xff0c;访问 MySQL Community Downloads。 选择版本 找到最新的 MySQL 社区版本。点击 Go to Download Page 按钮&#xff0c;进入下载页面。 下载 MSI 安装包 在下载页面中选择 Windows (x86, 64-bit), MSI Installer。点击 …

程序控制语句

选择语句 选择结构是指根据程序运行时候产生的结果或者用户的输入条件执行相应的代码。在Java中有两种选择语句可以使用&#xff1a;if和switch。使用它们可以根据条件来选择接下来要干什么。 if语句 f语句是最简单的选择语句。它可以控制程序在两个不同的路径中执行。下面是…

亚马逊云科技Bedrock知识库自定义语义搜索配置教程

借助亚马逊云科技的Amazon Bedrock知识库功能&#xff0c;我们可以安全地将Amazon Bedrock中的基础模型连接到我们的私有数据&#xff0c;实现检索增强生成&#xff08;RAG&#xff09;。给知识库挂载额外的数据有助于模型生成更相关、基于上下文的准确响应&#xff0c;而无需重…

Ajax:重塑Web交互体验的人性化探索

在数字化时代&#xff0c;网页的交互性和响应速度已成为衡量用户体验的关键指标。Ajax&#xff08;Asynchronous JavaScript and XML&#xff09;&#xff0c;作为前端与后端沟通的桥梁&#xff0c;凭借其异步通信的能力&#xff0c;极大地提升了网页的动态性和用户友好度&…

02.10 TCP之文件传输

1.思维导图 2.作业 服务器代码&#xff1a; #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <pthread.h> …

1.2 项目初始化实战

1.2 项目初始化实战 1.2.1 Maven多模块项目构建&#xff08;企业级标准&#xff09; 项目结构规范&#xff1a; parent-project&#xff08;父模块&#xff09; ├── pom.xml ├── common-core&#xff08;通用工具模块&#xff09; │ ├── src/main/java │ └─…

深度学习框架PyTorch

一、框架概览 深度学习框架&#xff1a;是一个针对深度学习的科学计算库&#xff0c;在深度学习领域&#xff0c;以下是当前市场上几个主流的深度学习框架&#xff1a; TensorFlow 上一代框架&#xff1a;起始于静态图时代&#xff0c;为早期深度学习的发展做出了巨大贡献。特…

适用于 Windows 的 Zed 编辑器的非官方稳定版。通过 scoop 或 pwsh 脚本轻松安装。不隶属于 Zed Industries

一、软件介绍&#xff08;文末提供下载&#xff09; Zed&#xff0c;这是一款由 Atom 和 Tree-sitter 的创建者提供的高性能多人 Atom and Tree-sitter.。 二、macOS 和 Linux安装 在 macOS 和 Linux 上&#xff0c;您可以直接下载 Zed 或通过本地包管理器安装 Zed。 本地包…