题目讲解18 有效的括号

原题链接:

20. 有效的括号 - 力扣(LeetCode)

思路分析:

第一步:先搭建一个数据结构——栈。

typedef char STDataType;
typedef struct Stack
{STDataType* arr;int top, capacity;
} Stack;//初始化
void StackInit(Stack* ps)
{assert(ps);ps->arr = NULL;ps->top = ps->capacity = 0;
}//入栈
void StackPush(Stack* ps, STDataType x)
{assert(ps);if(ps->top == ps->capacity){int NewCapacity = (ps->capacity == 0) ? 4 : ps->capacity * 2;STDataType* temp = (STDataType*)realloc(ps->arr, sizeof(STDataType) * NewCapacity);ps->arr = temp;ps->capacity = NewCapacity;}ps->arr[ps->top++] = x;
}//判断栈是否为空
bool StackEmpty(Stack* ps)
{assert(ps);return (ps->top == 0);
}//出栈
void StackPop(Stack* ps)
{assert(!StackEmpty(ps));ps->top--;
}//取栈顶元素
STDataType StackTop(Stack* ps)
{assert(!StackEmpty(ps));return ps->arr[ps->top - 1];
}//销毁
void StackDestroy(Stack* ps)
{assert(ps);if(ps->arr){free(ps->arr);}ps->arr = NULL;ps->top = ps->capacity = 0;
}

第二步:定义一个栈结构变量并初始化,再定义一个字符指针指向字符串。

    Stack st;StackInit(&st);char* pi = s;

第三步:通过字符指针开始遍历数组,如果是左括号就把数据入栈,不是的话就要取栈顶数据来和*pi的值对比,如果不匹配就可以直接返回false了。如果遍历完了都没有返回false的话,还不能直接返回true,因为栈中可能还有左括号,所以还需要最后判断一下栈是否为空,为空了才是true,不为空就是false。

开始遍历之前:

第一次遍历之后:

第二次遍历之后:

第三次遍历之后:

第四次遍历之后:

第五次遍历之后:

第六次遍历之后:

    while (*pi != '\0'){if ((*pi == '(') || (*pi == '[') || (*pi == '{')){StackPush(&st, *pi);}else{if (StackEmpty(&st))//*pi的值已经是右括号了,如果栈里面是空的话那属于不匹配了{StackDestroy(&st);return false;}char top = StackTop(&st);if ((top == '(' && *pi != ')')|| (top == '[' && *pi != ']')|| (top == '{' && *pi != '}')){StackDestroy(&st);return false;}StackPop(&st);}pi++;}bool ret = StackEmpty(&st) ? true : false;StackDestroy(&st);return ret;

完整代码:

bool isValid(char* s)
{Stack st;StackInit(&st);char* pi = s;while (*pi != '\0'){if ((*pi == '(') || (*pi == '[') || (*pi == '{')){StackPush(&st, *pi);}else{if (StackEmpty(&st))//*pi的值已经是右括号了,如果栈里面是空的话那属于不匹配了{StackDestroy(&st);return false;}char top = StackTop(&st);if ((top == '(' && *pi != ')')|| (top == '[' && *pi != ']')|| (top == '{' && *pi != '}')){StackDestroy(&st);return false;}StackPop(&st);}pi++;}bool ret = StackEmpty(&st) ? true : false;StackDestroy(&st);return ret;
}

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

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

相关文章

HarmonyOS笔记5:ArkUI框架的Navigation导航组件

ArkUI框架的Navigation导航组件 在移动应用中需要在不同的页面进行切换跳转。这种切换和跳转有两种方式:页面路由和Navigation组件实现导航。HarmonyOS推荐使用Navigation实现页面跳转。在本文中在HarmonyOS 5.0.0 Release SDK (API Version 12 Release)版本下&…

【在git中,如何删除远端的分支?】

在git中,如何删除远端的分支? eg总思路具体步骤 eg xxxxxx MINGW64 ~/Desktop/1/test_merge (main) $ 当前我们正处于main分支,那么应该如何删除master分支呢?总思路 你要先将要删除的分支合并到当前的主分支,然后才可以删除该分支. 具体步骤 要删除 Git 仓库中的 master…

搜维尔科技:Manus遥操作五指机械手专用手套惯性高精度虚拟现实

Manus遥操作五指机械手专用手套惯性高精度虚拟现实 搜维尔科技:Manus遥操作五指机械手专用手套惯性高精度虚拟现实

【C++】第九节:list

1、list的介绍及使用 1.1 list的介绍 list - C 参考 1.2 list的使用 1.2.1 list的构造 void TestList1() {list<int> l1; // 构造空的l1list<int> l2(4, 100); // l2中包含4个值为100的元素list<int> l3(l2.begin(), l2.end()); // 用l2的[begin(),end())…

Idea中创建和联系MySQL等数据库

备注&#xff1a;电脑中要已下好自己需要的MySQL数据库软件 MySQL社区版下载链接&#xff1a; https://dev.mysql.com/downloads/installer/ 优点&#xff1a; 1.相比与在命令行中管理数据库&#xff0c;idea提供了图形化管理&#xff0c;简单明了&#xff1b; 2.便于与后端…

django从入门到精通(五)——表单与模型

好的&#xff0c;下面将详细介绍 Django 的表单与模型&#xff0c;包括它们的定义、使用、如何在 Django Admin 中结合使用&#xff0c;以及相关的字段类型和验证机制。 Django 模型与表单 1. Django 模型 Django 模型是一个 Python 类&#xff0c;用于定义数据库中的数据结…

Linux_shell脚本if语句详细教程

前言 在 Linux Shell 脚本中&#xff0c;if 语句用于基于条件执行命令或代码块。它的基本语法结构如下&#xff1a; if 条件; then# 如果条件为真时执行的代码 elif 另一个条件; then# 如果另一个条件为真时执行的代码 else# 如果所有条件都不成立时执行的代码 fi一、if 语句…

Python自学之Colormaps指南

目录 1.色彩映射表&#xff08;Colormaps&#xff09;是什么&#xff1f; 2.Matplotlib中的色彩映射表类型 2.1同色渐变&#xff08;Sequential Colormaps&#xff09; 2.2双色渐变&#xff08;Divergence Colormaps&#xff09; 2.3定性色彩&#xff08;Qualitative Col…

PostgreSQL高可用Patroni安装(超详细)

目录 一 安装Patroni 0 Patroni 对Python的版本要求 1 卸载原来的Python 3.6 版本 2 安装Python 3.7 之上版本 3 安装依赖 psycopg3 4 安装patroni 5 卸载 patroni 二 安装ETCD 1 使用 yum 安装 etcd 2 etcd 配置文件 3 管理 etcd 4 设置密码 5 常用命令 三 安装…

利用redis的key失效监听器KeyExpirationEventMessageListener作任务定时提醒功能

某需求&#xff1a; 要求在任务截止日期的前3天时&#xff0c;系统自动给用户发一条消息提醒。 用定时任务的话感觉很不舒服。间隔时间不好弄。不能精准卡到那个点。 由于系统简单&#xff0c;没有使用消息列队&#xff0c;也不能使用延时队列来做。 用Timer的话开销还挺大的&a…

ubuntu下怎么设置机器程序开机自启?

在 Ubuntu 中&#xff0c;可以通过多种方法设置程序或脚本在系统启动时自动运行。以下是几种常见方法&#xff1a; 方法 1&#xff1a;使用 crontab crontab 是一个定时任务管理工具&#xff0c;可以用来设置程序在开机时自动运行。 1. 打开终端&#xff0c;编辑当前用户的 …

从视频帧生成点云数据、使用PointNet++模型提取特征,并将特征保存下来的完整实现。

文件地址 https://github.com/yanx27/Pointnet_Pointnet2_pytorch?spm5176.28103460.0.0.21a95d27ollfze Pointnet_Pointnet2_pytorch\log\classification\pointnet2_ssg_wo_normals文件夹改名为Pointnet_Pointnet2_pytorch\log\classification\pointnet2_cls_ssg "E:…

高效工具推荐:基于WebGPU的Whisper Web结合内网穿透远程使用指南

文章目录 前言1.本地部署Whisper Web1.1 安装git1.2 安装Node.js1.3 运行项目 2. Whisper Web使用介绍3. 安装Cpolar内网穿透4. 配置公网地址5. 公网访问测试6. 配置固定公网地址 前言 OpenAI开源的 Whisper 语音转文本模型效果都说还不错&#xff0c;今天就给大家推荐 GitHub…

大数据学习16之Spark-Core

1. 概述 1.1.简介 Apache Spark 是专门为大规模数据处理而设计的快速通用的计算引擎。 一种类似 Hadoop MapReduce 的通用并行计算框架&#xff0c;它拥有MapReduce的优点&#xff0c;不同于MR的是Job中间结果可以缓存在内存中&#xff0c;从而不需要读取HDFS&#xff0c;减少…

TDSQL 免密码登录

需求 os用户免密登录tdsql 解决方案 使用mysql自带的 mysql_config_editor 工具 提示&#xff1a;使用这个工具&#xff0c;登录密码不能包含#字符。 操作步骤 建os账号&#xff0c;切换到新账号 [roottdsql1 ~]# useradd jdbc_user [roottdsql1 ~]# su - jdbc_user [jd…

Go语言跨平台桌面应用开发新纪元:LCL、CEF与Webview全解析

开篇寄语 在Go语言的广阔生态中&#xff0c;桌面应用开发一直是一个备受关注的领域。今天&#xff0c;我将为大家介绍三款基于Go语言的跨平台桌面应用开发框架——LCL、CEF与Webview&#xff0c;它们分别拥有独特的魅力和广泛的应用场景。通过这三款框架&#xff0c;你将能够轻…

机器学习day5-随机森林和线性代数1最小二乘法

十 集成学习方法之随机森林 集成学习的基本思想就是将多个分类器组合&#xff0c;从而实现一个预测效果更好的集成分类器。大致可以分为&#xff1a;Bagging&#xff0c;Boosting 和 Stacking 三大类型。 &#xff08;1&#xff09;每次有放回地从训练集中取出 n 个训练样本&…

某某科技笔试题

&#xff08;15题&#xff0c;45分钟&#xff0c;闭卷&#xff09; 一、( 8 分 &#xff09;请问以下程序输出什么结果&#xff1f; char *getStr(void) 。 &#xff5b; char p[] "hellow world"; return p; &#xff5d; void test(void) &#xff5b; ch…

Excel使用-弹窗“此工作簿包含到一个或多个可能不安全的外部源的链接”的发生与处理

文章目录 前言一、探讨问题发生原因1.引入外部公式2.引入外部数据验证二、问题现象排查及解决1.排查公式2.排查数据验证3.特殊处理方式总结前言 作为一种常用的办公软件,Excel被大家所熟知。尽管使用了多年,有时候在使用Excel时候也会发生一些不太常见的现象,需要用心核查下…

跨越网络边界:IPv6与零信任架构的深度融合

2024年&#xff0c;工信部发布了《关于开展“网络去NAT”专项工作 进一步深化IPv6部署应用的通知》&#xff0c;加速了国内网络由IPv4向IPv6的转型步伐。未来&#xff0c;各行各业将逐步去NAT&#xff0c;逐步向IPv6迁移。在此过程中&#xff0c;网络安全解决方案和产品能力将面…