C语言实现括号匹配检查及栈的应用详解

目录

栈数据结构简介 

C语言实现栈 

栈的初始化 

栈的销毁 

栈的插入

栈的删除

栈的判空

获取栈顶数据 

利用栈实现括号匹配检查

总结 


在编程中,经常会遇到需要检查括号是否匹配的问题,比如在编译器中检查代码的语法正确性,或者在文本处理中确保括号的正确使用。本文将通过C语言实现一个括号匹配检查的程序,并详细介绍栈数据结构在其中的应用。
 


栈数据结构简介
 



栈是一种后进先出(LIFO, Last In First Out)的数据结构。它就像一个放盘子的栈,最后放上去的盘子总是最先被拿下来。在栈中,有几个基本操作:
 
- 初始化(Init):创建一个空栈。
 
- 销毁(Destroy):释放栈占用的内存。
 
- 插入(Push):将元素添加到栈顶。
 
- 删除(Pop):从栈顶移除元素。
 
- 判空(Empty):检查栈是否为空。
 
- 获取元素个数(Size):返回栈中元素的数量。
 
- 获取栈顶数据(Top):返回栈顶的元素,但不删除它。
 


C语言实现栈
 


c#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <stdbool.h>typedef char typestk;
typedef struct Stack
{typestk* a;int top;int capacity;
} ST;


 
这里定义了一个栈的结构体 Stack ,包含一个字符类型的指针 a 用于存储栈中的元素, top 表示栈顶的位置, capacity 表示栈的容量。
 


栈的初始化
 


c// 栈的初始化
void STInit(ST* ps)
{assert(ps);ps->a = (typestk*)malloc(sizeof(typestk) * 4);if (ps->a == NULL){perror("malloc");return;}ps->top = 0;ps->capacity = 4;
}


 
 STInit 函数用于初始化栈。首先通过 malloc 分配4个字符大小的内存空间给栈的数组 a ,如果分配失败,使用 perror 打印错误信息。然后将栈顶位置 top 设为0,栈容量 capacity 设为4。
 


栈的销毁
 


c// 栈的销毁
void STDestory(ST* ps)
{// 查空assert(ps);free(ps->a);ps->a = NULL;ps->capacity = ps->top = 0;
}


 
 STDestory 函数用于销毁栈。先使用 free 释放栈数组 a 占用的内存,然后将指针 a 设为 NULL ,并将栈顶位置 top 和栈容量 capacity 都设为0。
 


栈的插入

 
c// 栈的插入
void STPush(ST* ps, typestk x)
{assert(ps);if (ps->top == ps->capacity){typestk* tmp = (typestk*)realloc(ps->a, sizeof(typestk) * ps->capacity * 2);if (tmp == NULL){perror("realloc error");return;}ps->a = tmp;ps->capacity *= 2;}ps->a[ps->top] = x;ps->top++;
}


 
 STPush 函数用于将元素插入栈顶。首先检查栈是否已满(即 top 等于 capacity ),如果已满,使用 realloc 将栈的容量扩大为原来的2倍。如果内存重新分配失败,打印错误信息并返回。然后将元素 x 插入到栈顶位置,并将栈顶位置 top 加1。
 


栈的删除

 
c// 栈的删除
void STPop(ST* ps)
{assert(ps);assert(!STEmpty(ps));    ps->top--;
}


 
 STPop 函数用于从栈顶删除元素。首先检查栈是否为空,如果为空则使用 assert 断言报错。然后将栈顶位置 top 减1,相当于删除了栈顶元素。
 


栈的判空

 
c// 栈的判空
bool STEmpty(ST* ps)
{assert(ps);return ps->top == 0;
}STEmpty 函数用于检查栈是否为空。如果栈顶位置 top 为0,则返回 true ,否则返回 false 。栈的元素个数c// 栈的元素个数
int STSize(ST* ps)
{assert(ps);return ps->top;
}


 
 STSize 函数返回栈中元素的个数,即栈顶位置 top 的值。
 


获取栈顶数据
 


c// 获取栈顶数据
typestk STTop(ST* ps)
{assert(ps);assert(!STEmpty(ps));return ps->a[ps->top - 1];
}


 
 STTop 函数返回栈顶的元素,但不删除它。首先检查栈是否为空,如果为空则使用 assert 断言报错。然后返回栈顶位置 top - 1 处的元素。
 


利用栈实现括号匹配检查

 
cbool isValid(char* s)
{ST st;STInit(&st);while (*s){if (*s == '[' || *s == '(' || *s == '{'){STPush(&st, *s);}else{if (STEmpty(&st)){STDestory(&st);return false;}char top = STTop(&st);STPop(&st);if ((*s == ')' && top != '(') || (*s == ']' && top != '[') || (*s == '}' && top != '{')){STDestory(&st);return false;}}++s;}bool ret = STEmpty(&st);STDestory(&st);return ret;
}


 


 isValid 函数用于检查给定字符串中的括号是否匹配。
 
初始化一个栈 st 。
 
遍历字符串 s :
 
- 如果当前字符是左括号( [ 、 ( 、 { ),将其压入栈中。
 
- 如果当前字符是右括号( ] 、 ) 、 } ):
 
- 检查栈是否为空,如果为空,说明没有匹配的左括号,返回 false 。
 
- 否则,获取栈顶元素并弹出栈,检查栈顶元素是否与当前右括号匹配。如果不匹配,返回 false 。

 
遍历结束后,如果栈为空,说明所有括号都匹配,返回 true ;否则返回 false 。最后销毁栈。
 


总结
 


通过以上代码,我们实现了一个简单的栈数据结构,并利用栈解决了括号匹配检查的问题。栈作为一种基本的数据结构,在很多算法和应用中都有广泛的应用,如表达式求值、深度优先搜索等。掌握栈的基本操作和应用场景,对于提升编程能力和解决实际问题都非常有帮助。希望本文能帮助你更好地理解栈和括号匹配问题。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【机器学习chp12】半监督学习(自我训练+协同训练多视角学习+生成模型+半监督SVM+基于图的半监督算法+半监督聚类)

目录 一、半监督学习简介 1、半监督学习的定义和基本思想 2、归纳学习 和 直推学习 &#xff08;1&#xff09;归纳学习 &#xff08;2&#xff09;直推学习 3、半监督学习的作用与优势 4、半监督学习的关键假设 5、半监督学习的应用 6、半监督学习的常见方法 7、半…

2024 年第四届高校大数据挑战赛-赛题 A:岩石的自动鉴定

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

基于WebRTC与P2P技术,嵌入式视频通话EasyRTC实现智能硬件音视频交互,适配Linux、ARM、RTOS、LiteOS

EasyRTC不仅仅是一个连接工具&#xff0c;更是一个经过深度优化的通信桥梁。它在嵌入式设备上进行了特殊优化&#xff0c;通过轻量级SDK设计、内存和存储优化以及硬件加速支持&#xff0c;解决了传统WebRTC在嵌入式设备上的适配难题&#xff0c;显著节省了嵌入式设备的资源。 1…

[c语言日寄]字符串进阶:KMP算法

【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋&#xff1a;这是一个专注于C语言刷题的专栏&#xff0c;精选题目&#xff0c;搭配详细题解、拓展算法。从基础语法到复杂算法&#xff0c;题目涉及的知识点全面覆盖&#xff0c;助力你系统提升。无论你是初学者&#xff0c;还是…

Android源码学习之Overlay

在 Android Framework 开发中&#xff0c;Overlay 主要用于修改和替换系统或应用的资源&#xff0c;而无需直接修改源码&#xff0c;与源码解耦。Overlay 机制可以分为 两种类型&#xff1a; 静态 Overlay&#xff08;Static Resource Overlay, SRO&#xff09; 在 编译时 覆…

【MySQL】基本操作 —— DDL

目录 DDLDDL 常用操作对数据库的常用操作查看所有数据库创建数据库切换、显示当前数据库删除数据库修改数据库编码 对表的常用操作创建表数据类型数值类型日期和时间类型字符串类型 查看当前数据库所有表查看指定表的创建语句查看指定表结构删除表 对表结构的常用操作给表添加字…

网络安全需要学多久才能入门?

网络安全是一个复杂且不断发展的领域&#xff0c;想要入行该领域&#xff0c;我们需要付出足够多的时间和精力好好学习相关知识&#xff0c;才可以获得一份不错的工作&#xff0c;那么网络安全需要学多久才能入门?我们通过这篇文章来了解一下。 学习网络安全的入门时间因个人的…

【测试语言基础篇】Python基础之List列表

一、Python 列表(List) 序列是Python中最基本的数据结构。序列中的每个元素都分配一个数字 - 它的位置&#xff0c;或索引&#xff0c;第一个索引是0&#xff0c;第二个索引是1&#xff0c;依此类推。 Python有6个序列的内置类型&#xff0c;但最常见的是列表和元组。序列都可…

编译系统设计原理概述

目录 简介 词法分析 正则表达式 有穷状态自动机 从正则表达式到有穷自动机的转换 单词识别 简介 主要介绍编译系统设计过程中涉及的原理与技术&#xff0c;主要分为前端设计和后端设计两 个模块。前端部分包括词法分析器、语法分析器的构建和语义分析过程的设计…

ArcGIS Pro 车牌分区数据处理与地图制作全攻略

在大数据时代&#xff0c;地理信息系统&#xff08;GIS&#xff09;技术在各个领域都有着广泛的应用&#xff0c;而 ArcGIS Pro 作为一款功能强大的 GIS 软件&#xff0c;为数据处理和地图制作提供了丰富的工具和便捷的操作流程。 车牌数据作为一种重要的地理空间数据&#xf…

前端登录鉴权全解析:主流方案对比与实现指南

文章目录 一、常见登录鉴权方式概览1.1 主流方案对比1.2 技术特性对比 二、Session/Cookie方案2.1 实现原理2.2 代码实现2.3 优缺点分析 三、JWT方案3.1 实现原理3.2 代码实现3.3 优缺点分析 四、OAuth方案4.1 实现原理4.2 代码实现4.3 优缺点分析 五、SSO方案5.1 实现原理5.2 …

算法系列之回溯算法求解数独及所有可能解

有没有对数独感兴趣的朋友呢&#xff1f;数独作为一款经典的逻辑游戏&#xff0c;其目标是在一个9x9的方格中填入数字1至9&#xff0c;确保每一行、每一列以及每一个3x3的子网格中都包含这些数字且不重复。尽管数独的规则看似简单&#xff0c;但编写一个能够自动求解数独的程序…

华为hcia——Datacom实验指南——TCP传输原理和数据段格式

什么是TCP TCP是一种可靠的端到端的传输层协议&#xff0c;仅应用于单波通信。 采用TCP协议作为传输方式的应用层服务&#xff0c;再进行数据传输前&#xff0c;都需要进行TCP协议的创建。 TCP报文的格式 sequence number&#xff08;序列号&#xff09; 占4个字节&#x…

Vlog 片头制作

打开剪映&#xff0c;新建草稿&#xff0c;导入黑色背景。 拉长时间轴&#xff0c;背景时常调整为4.2秒。 添加文本&#xff0c;输入 5 个“|”&#xff0c;每个中间 2 个空格&#xff0c;如下| | | | |&#xff0c;然后手动放大文本&#xff0c;让中间显示出四个间隔。 继续添…

【Nacos】服务发布之优雅预热上线方案

目录 一、背景二、注册时机2.1、注册机制2.2、分析源码找到注册时机 三、注册前心跳健康检测3.1、方案实施3.2、源码分析3.3、优化代码 四、流量权重配置五、总结5.1、整体完整流程&#xff1a;5.2、流程图&#xff1a;5.1、优化方案完整代码&#xff1a; 一、背景 有些面向广…

VXLAN 组播 RP

一、Anycast RP 在每个 VTEP 上&#xff0c;每个多播组都会建立一个源树 (S,G)&#xff0c;并且在双活 Leaf 设备上到 RP 地址是 ECMP 路径。 在 PIM ASM 模式下&#xff0c;(S,G) 组在 VTEP 端创建。由于每个 VTEP 都能够为特定的多播组发送和接收多播流量&#xff0c;因此每…

【第七节】windows sdk编程:Windows 中的对话框

目录 引言 一、对话框简介 1.1 对话框的创建 1.2 基本函数 1.3 模态对话框与非模态对话框 1.4 对话框与窗口的区别 二、模态对话框编程方法 2.1 模态对话框编程 2.2 消息框 三、非模态对话框编程方法 四、综合代码案例 引言 在Windows应用程序开发中&#xff0c;对话…

安装并配置终端字体

1. 简介 在使用 Oh My Zsh Powerlevel10k 时&#xff0c;正确的字体配置至关重要。Powerlevel10k 依赖 Nerd Fonts 扩展字体&#xff0c;以正确显示 Git 状态、分支、时间、图标等信息。 如果没有正确配置字体&#xff0c;你可能会看到 乱码、问号&#xff08;?&#xff09…

LeetCode - #227 基于 Swift 实现基本计算器

摘要 在这篇文章中&#xff0c;我们将实现一个基于 Swift 语言的基本计算器。该计算器能够解析和计算包含 、-、* 和 / 的数学表达式&#xff0c;并且遵循运算符的优先级规则。整数除法仅保留整数部分&#xff0c;不能使用 eval() 这样的内置解析方法。 描述 给你一个字符串表…

智慧应急消防解决方案(35页PPT)(文末有下载方式)

详细资料请看本解读文章的最后内容。在当今社会&#xff0c;消防安全至关重要&#xff0c;关乎人民生命财产安全和社会稳定。随着科技的飞速发展&#xff0c;智慧应急消防解决方案应运而生&#xff0c;为消防工作带来了新的变革和机遇。接下来&#xff0c;让我们深入探讨这份智…