数据结构:栈和队列的练习题1(括号匹配问题)

题目描述:


思路:我们首先可以把出现的情况大致分为以下几类:


 因为涉及匹配问题,所以所有的左括号和右括号肯定要分开来整理。如果我们直接去匹配的话(像第一行的从左到右独立匹配)是行得通的,但是遇到第二行的情况就识别不了了,因为第二种有顺序要求,先识别的左括号必须和后识别的右括号配对,这与栈的性质十分相似,所以我们想到用栈来实现这道题:

二者联系方式:

当遇到左括号时便使其进入栈,当遇到右括号时再去栈顶元素和右括号进行匹配。如果是同种类型的括号就匹配成功,将栈顶元素出栈并继续匹配;若匹配失败则直接return。

为预防碰到括号数量不对等时,我们可以引入count变量来记录左括号和右括号的个数,一次来解决做题时遇到的一些问题。

完整代码如下:

typedef char DataType;typedef struct Stack
{DataType* p;int top;int Capacity;
}ST;// 初始化函数
void STInit(ST* pst)
{assert(pst);pst->p = NULL;pst->Capacity = 0;pst->top = 0;
}// 入栈  出栈
void STPush(ST* pst, DataType x)
{assert(pst);//扩容if (pst->Capacity == pst->top)  {int NewCapacity = pst->Capacity == 0 ? 4 : 2 * pst->Capacity;DataType* tmp = (DataType*)realloc(pst->p, sizeof(DataType) * NewCapacity);pst->Capacity = NewCapacity;pst->p = tmp;}pst->p[pst->top] = x;pst->top++;
}//出栈
void STPop(ST* pst)
{assert(pst);pst->top--;
}// 取栈顶数据
DataType STTop(ST* pst)
{return pst->p[pst->top - 1];
}// 判空
bool STEmpty(ST* pst)
{if (pst->top == 0){return false;}else{return true;}
}// 获取数据个数
int STSize(ST* pst)
{return pst->top;
}bool isValid(const char* s)
{ST st;STInit(&st);int count=0;int count1 = 0;int count2 = 0;while (*s != '\0'){if (*s == '(' || *s == '[' || *s == '{'){STPush(&st, *s);count++;count1++;}if (*s == ')' || *s == ']' || *s == '}'){count--;count2++;//没有左括号的情况if (STEmpty(&st) == false){return false;}char ret = STTop(&st);//匹配成功if ((*s == ')' && ret == '(') || (*s == ']' && ret == '[') || (*s == '}' && ret == '{')){STPop(&st);}else{//匹配失败return false;}}s++;}if (count%2!=0||count1!=count2){return false;}return true;
}

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

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

相关文章

C/C++|我们为什么应该使用 `std::make_shared` 创建 `std::shared_ptr`

std::make_shared 是 C11 引入的一个工厂函数,用于创建 std::shared_ptr。与直接使用 new 并将其传递给 std::shared_ptr 构造函数相比,std::make_shared 提供了一种更高效、更安全的方法来分配和管理动态内存。 前置知识1: 当我们调用诸如&a…

关于d3js生成节点画布的个人笔记

实现功能 根据鼠标位置生成节点根据节点位置通过鼠标拖拽生成连线实现自定义线段颜色功能删除节点以及连线功能实现单个节点拖动功能实现整条线路的拖动功能 界面如下: 主要模块介绍 绘制连线 const line svg.selectAll(".line").data(links, d >…

【Linux】Git超详细教程:手把手教你(gitee版)--版本管理+远程仓库克隆(初学者必看!!!)

目录 一、前言 二、git 的深度理解 🥝 什么是 git ? 🍇 git 的历史发展(理解 git 的由来) 🍋 感性理解 git 的版本管理 三、git 的安装 ✨Window 终端安装 ✨Linux 安装 四、git 的工作流程 五、如何在 Linux …

音视频开发—视频相关概念:YUV与RGB

文章目录 YUV相关概念组成部分优点常见的 YUV 格式数据量的计算YUV4:2:0 存储格式平面模式(planar):打包模式(packed) RGB 和 YUV 的定义关系与转换RGB 到 YUV 的转换YUV 到 RGB 的转换 使用场景优缺点 YUV相关概念 YUV 是一种颜色编码格式&…

JVM-JAVA-类加载过程

JVM源码 类加载到 JVM 的过程通过 java 命令执行代码的流程 类加载到 JVM 的过程 在运行一个 main 函数启动程序是,首先需要类加载起把主类加载到 JVM 中 通过 java 命令执行代码的流程 loadClass的类加载过程有如下几步: 类被加载到方法区中后主要包…

Maven项目通过maven central 发布到中央仓库 https://repo.maven.apache.org/ 手把手教学 最新教学

一、注册maven central账号 ​ https://central.sonatype.com/publishing/namespaces 我这里直接使用github账号登录 ,可以自己注册或者直接使用google账号或者github账号登录 这里github账号登录之后 应该只出现io.github 下面的io.gitee我也验证过 所以这里出…

Java时间类--JDK8

为什么JDK8会又新增时间相关类呢? ① JDK7的时间对象如果需要比较大小的话,必须都先转换成毫秒值;JDK8则不需要,可以直接比较。 ② JDK7的时间对象可以修改,在多线程环境下就会导致数据不安全;JDK8不能修改…

数据库open报ORA-600 kcratr_scan_lastbwr故障处理---惜分飞

由于断电,导致数据库正常open报ORA-600 kcratr_scan_lastbwr错误 Wed Jan 17 18:23:26 2024 ALTER DATABASE MOUNT Successful mount of redo thread 1, with mount id 1028618590 Database mounted in Exclusive Mode Lost write protection disabled Completed:…

【Git】在错误分支上开发了怎么办

情况一:还未提交 git add . 『暂存修改的代码』git stash 『把暂存的文件提交到git的暂存栈』git checkout 『本该提交代码的分支』git stash pop 『取出暂存栈中的代码』 情况二:已提交 git checkout 『不该提交代码提交了代码的分支』git reset HEA…

输入3个字符串,要求将字母按由小到大顺序输出

对于将3个整数按由小到大顺序输出,是很容易处理的。可以按照同样的算法来处理将3个字符串按大小顺序输出。可以直接写出程序。 编写程序: 运行结果: 这个程序是很好理解的。在程序中对字符串变量用关系运算符进行比较,如同对数值…

【Git 版本管理】合并 + 变更,看懂Git

看懂 Git 合并操作分离 HEAD分离 HEAD 测试 相对引用(^ || ~)操作符 ^相对引用 ^ 测试操作符 ~相对引用 ~ 测试 撤销变更Git ResetGit Revert撤销变更 测试 整理提交记录Git Cherry-pick测试 交互式 rebase交互式 rebase 测试 合并操作 关键字:commit、branch、merg…

Minio篇:初识MinIO

1. MinIO快速入门 1.1.MinIO核心概念 下面介绍MinIO中的几个核心概念,这些概念在所有的对象存储服务中也都是通用的。 对象(Object) 对象是实际的数据单元,例如我们上传的一个图片。 存储桶(Bucket) 存储…

基于单片机的机械臂的研究

摘要 : 工业机器人是现代科学技术的融合下的产物,属于机电自动化设备的一种。机械臂作为工业机器人的核心,在提高工业生产效率的同时,也保障了工作人员的身心安全。本文以某款基于单片机的机械臂为例,对机械臂的设计方…

【JAVA SE】多态

✨✨欢迎大家来到Celia的博客✨✨ 🎉🎉创作不易,请点赞关注,多多支持哦🎉🎉 所属专栏:JAVA 个人主页:Celias blog~ 目录 引言 一、多态 1.1 多态的概念 1.2 多态的实现条件 1.3…

AI未来预测

随着科技的飞速发展,人工智能(AI)已经成为了当今世界的热门话题。从自动驾驶汽车到智能家居,从虚拟助手到机器人,AI的应用已经渗透到了我们生活的方方面面。在未来,AI将会继续改变我们的生活方式&#xff0…

深入探讨 Android 的 View 显示过程与源码分析

文章目录 1. 探讨 Android 的 View 显示过程1.1. onFinishInflate1.2. onAttachedToWindow1.3. onMeasure1.4. onSizeChanged1.5. onLayout1.6. onDraw 2. 系统代码分析1.1. onFinishInflate1.2. onAttachedToWindow1.3. onMeasure1.4. onSizeChanged1.5. onLayout1.6. onDraw …

【Spring Boot】SpringBoot 下在 yml 中的 logging 日志配置

文章目录 前言输出日志的级别日志输出的位置日志输出的格式日志文件的存储路径日志文件是否输出到控制台配置Logback 配置日志分组配置日志细粒度配置【logger】 前言 logging 配置主要用于控制应用程序的日志输出行为,可以通过配置定制日志的格式、级别、输出位置…

数字化浪潮中的TPM革新:打造高效生产新范式

在数字化浪潮席卷全球的今天,传统生产管理模式正面临前所未有的挑战与机遇。TPM(全面生产维护)作为一种先进的生产管理理念,如何在数字化驱动下焕发新的活力,成为制造业转型升级的关键一环。 数字化技术为TPM带来了前…

Ubuntu禁止内核自动更新

查看当前内核版本 uname -v #35~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Tue May 7 09:00:52 UTC 2 uname -a Linux GKJ 6.5.0-35-generic #35~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Tue May 7 09:00:52 UTC 2 x86_64 x86_64 x86_64 GNU/Linux uname -r 6.5.0-35-generic 方法1&am…

EureKa是什么?

Eureka 是一个源于 Netflix 公司的开源项目,主要用于实现服务注册和服务发现的功能。它是构建分布式系统中的微服务架构的一个关键组件。下面是对 Eureka 的解释: 基本概念 Eureka 是基于 REST 的服务,主要用于管理微服务架构中的服务实例的…