当前位置: 首页 > news >正文

栈的应用(括号匹配)

文章目录

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

核心思想

逻辑本质:括号匹配是典型的“嵌套结构”。最后出现的左括号,必须最先被匹配(后进先出)。
括号具备就近匹配、后进先出的特性:后出现的左括号,必须先和最近的右括号配对,完美契合栈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个空间)。

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

http://www.cnnetsun.cn/news/3570899.html

相关文章:

  • 新手部署 OpenClaw 2.7.9 避坑全攻略,网关离线、安全拦截处理办法(含安装包)
  • 算力、先验知识与自主进化:以《苦涩的教训》审视 LLM 边界及下一代智能范式转向
  • 如何快速搭建个人漫画图书馆:哔咔漫画下载器终极完整解决方案
  • RS485相关知识
  • 后备命令处理_add-fallback-commands
  • SolidWorks快捷键全攻略:从S键到自定义,解锁高效设计
  • 一文读懂汽车CAN总线 —— 从原理到故障诊断
  • 精准授时破局时序难题,NTP 授时服务器筑牢各行业时间基准
  • UE4样条曲线高效铺路:5分钟实现地形自适应道路生成
  • pythonlist案例(解包)
  • 【Bug已解决】DPOTrainer does not work for multimodal Gemma 4 解决方案
  • 嵌入式USB接收端点寄存器配置详解:从FIFO、DMA到双缓冲实战
  • Python自动化视频混剪工具开发:从素材搜索到合成全流程
  • 数据迁移一致性保障:三阶段验证与双通道审计实践
  • 国际集运物流模块开发|Taocarts 反向代购系统物流核算与轨迹同步技术方案
  • 2026亚太EMBA含金量中立测评|民营企业家择校参考
  • Django网络安全学习系统:计算机毕设实战指南与部署教程
  • 回溯算法精解:从排列组合问题掌握决策树与剪枝核心思想
  • MCP Server:AI Agent安全高效调用业务API的标准化方案
  • 小程序毕设项目: 基于 Node.js 的实验课堂日志填报、审核与统计平台 智慧实验室教学信息记录管理系统(源码+文档,讲解、调试运行,定制等)
  • OpenHarmony 6.1(API23)端侧 AI Native C++ 交叉编译工具链配置与验证手册
  • Windows下Rust与C/C++混合开发环境配置:WinLibs GCC 15与CMake 4实践指南
  • 从零实现C++多线程HTTP服务器:深入理解网络编程与并发模型
  • 如何快速配置Arnis:高级用户的完整Minecraft城市生成指南
  • STM32F103程序下载全攻略:串口与SWD详解
  • Cocos Creator Shader实战指南:从基础到高级特效实现
  • WPS AI模板市场私域运营秘术:如何用1个模板撬动2000+精准用户并沉淀至企微?
  • Android功耗系列专题理论之三:cpu 功耗问题分析方法
  • PHP 8.5容器化实战:从基础镜像到生产部署
  • 计算机科学:数据库与数据管理概览