news 2026/7/21 23:31:47

栈的应用(括号匹配)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
栈的应用(括号匹配)

文章目录

  • 核心思想
  • 代码实现
  • 查考方式
    • 方式一:手动模拟栈的变化(考察“栈内元素”)
    • 方式二:考察“失败”的边界条件(三种失败模式)
    • 方式三:算法的时间/空间复杂度

核心思想

逻辑本质:括号匹配是典型的“嵌套结构”。最后出现的左括号,必须最先被匹配(后进先出)。
括号具备就近匹配、后进先出的特性:后出现的左括号,必须先和最近的右括号配对,完美契合栈LIFO规则。

  • 遇到左括号:压入栈底(等待匹配)。
  • 遇到右括号:检查栈顶。如果栈顶是对应的左括号,则弹出(匹配成功);否则匹配失败。
  • 遍历结束:如果栈为空,则全部匹配;如果栈不为空,说明有左括号多余。

代码实现

#include<stdio.h>#include<stdbool.h>#include<string.h>#defineMaxSize10// 定义栈中最大元素的个数 若存满了 可使用 链栈typedefstruct{chardata[MaxSize];// 静态数组存放栈中元素inttop;// 栈顶指针:指向栈顶元素(初始为-1)}SqStack;// 基础操作// 考试中可直接使用基本操作,建议简要说明接口作用// 1.初始化栈 初始化空栈,指针指向数组下标 -1(无效位置)voidInitStack(SqStack&S){S.top=-1;// 空栈标志}// 2.判断栈是否为空 判断栈是否为空(top 是否为 -1)boolStackEmpty(SqStack S){returnS.top==-1;}// 3.新元素入栈 入栈:先移指针(top++),再放元素boolPush(SqStack&S,charx){if(StackFull(S))returnfalse;// 栈满报错S.data[++S.top]=x;// 先移指针,再存数据returntrue;}// 4.栈顶元素出栈,用 x 返回 出栈:先取元素,再移指针(top--)boolPop(SqStack&S,char&x){if(StackEmpty(S))returnfalse;// 栈空报错x=S.data[S.top--];// 先取数据,再移指针returntrue;}// 核心逻辑函数boolbracketCheck(charstr[],intlength){SqStack S;InitStack(S);// 初始化栈for(inti=0;i<length;i++){// 1. 遇到左括号:入栈if(str[i]=='('||str[i]=='['||str[i]=='{'){Push(S,str[i]);// 扫描到左括号,入栈}else{// 2. 遇到右括号:进行匹配检查if(str[i]==')'||str[i]==']'||str[i]=='}'){// 【考点】如果栈为空,说明右括号单身,匹配失败if(StackEmpty(S)){returnfalse;// 右括号单身,匹配失败}chartopElem;Pop(S,topElem);// 弹出栈顶左括号 栈顶元素出栈// 检查弹出的左括号是否与当前右括号匹配if(str[i]==')'&&topElem!='(')returnfalse;if(str[i]==']'&&topElem!='[')returnfalse;if(str[i]=='}'&&topElem!='{')returnfalse;}}// 3. 忽略其他非括号字符}// 【考点】遍历结束后,栈非空说明左括号多了returnStackEmpty(S);// 检索完全部括号后,栈空说明匹配成功}

查考方式

方式一:手动模拟栈的变化(考察“栈内元素”)

形式给出一个括号序列,问“栈中元素个数最多的时候是多少?”或“某一时刻栈底的元素是什么?”
实战演示:序列{ [ ( ) ] } ( )

扫描字符操作栈内元素(栈底→栈顶)备注
{入栈{栈底
[入栈{ [
(入栈{ [ (此时栈内元素最多(3个)
)匹配 ({ [弹出 (
]匹配 [{弹出 [
}匹配 {弹出 {
(入栈(
)匹配 (弹出 (

答案:最多时有3个元素;栈底始终是{

方式二:考察“失败”的边界条件(三种失败模式)

(选择题)算法会在以下三种情况返回false

三种失败对应代码行通俗记忆
左括号单身return StackEmpty(S);(返回 false)“左剩了” —— 遍历完,栈底还有存货
右括号单身if (StackEmpty(S))return false;“右多了” —— 刚来右括号,栈却空了
左右不匹配if (topElem != ...)return false;“穿错鞋” —— 栈顶是圆括号,却来了方括号

方式三:算法的时间/空间复杂度

  • 时间复杂度O(n)(只需遍历一次字符串,每个元素入栈/出栈一次)。
  • 空间复杂度O(n)(最坏情况下全是左括号,栈需要n个空间)。

用栈实现括号匹配:依次扫描所有字符,遇到左括号入栈,遇到右括号则弹出栈顶元素检查是否匹配。
匹配失败的情况:①左括号单身②右括号单身③左右括号不匹配

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/21 23:24:00

如何快速搭建个人漫画图书馆:哔咔漫画下载器终极完整解决方案

如何快速搭建个人漫画图书馆&#xff1a;哔咔漫画下载器终极完整解决方案 还在为哔咔漫画的网络加载缓慢而烦恼吗&#xff1f;picacomic-downloader 是一款专为 manhuabika.com&#xff08;哔咔漫画、pica漫画、bika漫画、PicACG&#xff09;设计的专业级多线程下载器&#xf…

作者头像 李华
网站建设 2026/7/21 23:23:18

RS485相关知识

1:接地的选择 2:A/B特性差分阻抗为120欧姆~注意PCB的布局布线 须采用国际上通行的屏蔽双绞线。线材特性阻抗120Ω。采用屏蔽双绞线有助于减少和消除两根RS485 通信线之间产生的分布电容以及来自于通讯线周围产生的共模干扰 3:采用手拉手菊花链连接方式 4:.线缆较长时增加终端…

作者头像 李华
网站建设 2026/7/21 23:20:55

后备命令处理_add-fallback-commands

以下为本文档的中文说明 该技能指导开发者如何为VS Code命令面板&#xff08;Command Palette&#xff09;扩展添加后备命令功能&#xff0c;实现全面搜索行为。当用户在命令面板中输入的查询无法匹配任何顶层命令时&#xff0c;后备命令会被触发&#xff0c;使扩展能充当全面处…

作者头像 李华
网站建设 2026/7/21 23:19:52

SolidWorks快捷键全攻略:从S键到自定义,解锁高效设计

你是不是也遇到过这样的场景&#xff1a;在SolidWorks里画图&#xff0c;左手在键盘上摸索半天&#xff0c;右手握着鼠标来回切换工具&#xff0c;一个简单的操作硬是拖慢了整个设计节奏&#xff1f;或者&#xff0c;看着同事行云流水地建模&#xff0c;自己却还在菜单栏里“大…

作者头像 李华