C语言编程--17.有效的括号

题目:

给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。

示例 1
输入:s = “()”
输出:true

示例 2
输入:s = “()[]{}”
输出:true

示例 3
输入:s = “(]”
输出:false

示例 4
输入:s = “([])”
输出:true

提示

1 <= s.length <= 104
s 仅由括号 ‘()[]{}’ 组成

代码:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>// 定义链表节点结构体
// 每个节点包含一个字符数据和一个指向下一个节点的指针
typedef struct Node
{char data;  // 存储字符数据struct Node *next;  // 指向下一个节点的指针
} Node;// 定义栈结构体
// 栈使用链表实现,top 指针指向栈顶节点
typedef struct
{Node* top;  // 栈顶指针
} Stack;// 初始化栈
// 该函数将栈的 top 指针置为 NULL,表示栈为空
void initStack(Stack* s)
{s->top = NULL;  // 将栈顶指针置为 NULL
}// 判断栈是否为空
// 如果栈的 top 指针为 NULL,则栈为空,返回 1;否则返回 0
int isEmpty(Stack* s)
{return s->top == NULL;  // 判断栈顶指针是否为 NULL
}// 入栈操作
// 该函数将一个字符压入栈中
void push(Stack* s, char value)
{// 为新节点分配内存Node* newnode = (Node*)malloc(sizeof(Node));if (newnode == NULL){// 内存分配失败,输出错误信息printf("内存分配失败!");return;}newnode->data = value;  // 将数据存入新节点newnode->next = s->top;  // 新节点的 next 指针指向原栈顶节点s->top = newnode;  // 更新栈顶指针为新节点
}// 出栈操作
// 该函数将栈顶元素弹出
void pop(Stack* s)
{if (isEmpty(s)){// 栈为空,输出错误信息printf("栈为空");return;}Node* temp = s->top;  // 临时指针指向栈顶节点char value = temp->data;  // 获取栈顶节点的数据s->top = s->top->next;  // 更新栈顶指针为原栈顶节点的下一个节点free(temp);  // 释放原栈顶节点的内存
}// 判断字符串中的括号是否有效
// 该函数使用栈来检查字符串中的括号是否匹配
bool isValid(char* s) {Stack stack;initStack(&stack);  // 初始化栈int n = strlen(s);  // 获取字符串的长度for (int i = 0; i < n; i++){if (s[i] == '(' || s[i] == '{' || s[i] == '[')// 如果是左括号,直接入栈push(&stack, s[i]);else if (s[i] == ')' && stack.top && stack.top->data == '(')// 如果是右括号且栈不为空,并且栈顶元素是对应的左括号,则出栈pop(&stack);else if (s[i] == ']' && stack.top && stack.top->data == '[')// 如果是右括号且栈不为空,并且栈顶元素是对应的左括号,则出栈pop(&stack);else if (s[i] == '}' && stack.top && stack.top->data == '{')// 如果是右括号且栈不为空,并且栈顶元素是对应的左括号,则出栈pop(&stack);else// 其他情况,将字符入栈push(&stack, s[i]);}if (stack.top)// 如果栈不为空,说明有括号不匹配,返回 falsereturn false;else// 如果栈为空,说明所有括号都匹配,返回 truereturn true; 
}

代码分析:

逻辑清晰:代码结构清晰,将栈的基本操作(初始化、入栈、出栈、判断是否为空)封装成独立的函数,提高了代码的可读性和可维护性。isValid 函数利用栈的特性来判断括号是否匹配,逻辑简洁明了。
内存管理:在入栈操作中,会检查内存分配是否成功,避免了因内存分配失败而导致的程序崩溃。在出栈操作中,会释放栈顶节点的内存,避免了内存泄漏。
扩展性:栈的实现使用链表,易于扩展。如果需要存储更多类型的数据,只需要修改 Node 结构体的 data 成员即可。

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

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

相关文章

代码随想录算法训练营第60期第十七天打卡

今天我们继续进入二叉树的下一个章节&#xff0c;今天的内容我在写今天的博客前大致看了一下部分题目难度不算大&#xff0c;那我们就进入今天的题目。 第一题对应力扣编号为654的题目最大二叉树 这道题目的坑相当多&#xff0c;我第一次题目没有看明白就是我不知道到底是如何…

Burp靶场JWT学习笔记1

JWT(JSON Web Token) 从其名字就可以看出来&#xff0c;它具有表示身份的作用&#xff0c;其本质是将用户信息储存到一串json字符串中再将其编码得到一串token JWT由三部分组成&#xff0c;分别是 Header&#xff0c;Payload&#xff0c;Signatrue JWTBase64(Header).Base6…

第53.5讲 | 小项目实战:用 SHAP 值解释农作物产量预测模型 [特殊字符][特殊字符]

目录 ✅ 项目背景 &#x1f4e6; 所用工具 &#x1f4c1; 数据字段&#xff08;模拟&#xff09; &#x1f9d1;‍&#x1f4bb; 代码实现步骤 &#x1f3af; 解读与启发 &#x1f9e0; 项目拓展建议 ✅ 项目背景 我们使用一个简化的玉米产量数据集&#xff08;可模拟实…

极狐GitLab 合并请求依赖如何解决?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 合并请求依赖 (PREMIUM ALL) 在极狐GitLab 16.6 中引入了对复杂合并依赖关系的支持&#xff0c;通过名为 remove_mr_blockin…

Django DRF实现用户数据权限控制

在 Django DRF 中使用 ModelViewSet 时&#xff0c;若需实现用户仅能查看和操作自己的数据详情&#xff0c;同时允许所有认证用户访问列表&#xff0c;需结合权限类和动态权限分配。以下是具体步骤&#xff1a; 1. 自定义对象权限类 创建一个 IsOwner 权限类&#xff0c;检查…

【数据结构】——线性表之单链表

一、单链表的概念和结构 1、单链表的概念&#xff1a; 链表也是属于我们的线性表中的一种&#xff0c;其物理结构上是不一定连续的&#xff0c;但是逻辑结构上是一定连续的&#xff0c;所以其是没办法像前面的顺序表一样通过找到下一个元素的&#xff0c;其是通过指针来找到下…

线程函数库

pthread_create函数 pthread_create 是 POSIX 线程库&#xff08;pthread&#xff09;中的一个函数&#xff0c;用于创建一个新的线程。 头文件 #include <pthread.h> 函数原型 int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*s…

2.5 桥梁桥面系及附属结构施工

2.5.1 桥面系施工 1.排水设施 设置纵横坡及泄水孔&#xff0c;减少桥面积水、防排结合。汇水槽、泄水孔顶面高程低于桥面铺装10-15mm。泄水孔边缘设渗水盲沟泄水管下端至少应伸出构筑物底面100-150mm。泄水管通过竖向管道直接引至地面或雨水管线。竖向管道抱箍、卡环、定位卡…

docker 代理配置冲突问题

问题描述 执行 systemctl show --property=Environment docker 命令看到有如下代理配置 sudo systemctl show --property=Environment docker Environment=HTTP_PROXY=http://127.0.0.1:65001 HTTPS_PROXY=http://127.0.0.1:65001 NO_PROXY=127.0.0.1,docker.io,ghcr.io,uhub…

MATLAB基础应用精讲-【基础知识篇】发布和共享 MATLAB 代码

目录 MATLAB发布代码---生成文档pdf 分节符对发布文件的分节 实时脚本 Matlab workspace与m脚本数据共享 发布和共享 MATLAB 代码 在实时编辑器中创建和共享实时脚本 发布 MATLAB 代码文件 (.m) 添加帮助和创建文档 发布 MATLAB 代码文件 (.m) 可创建包括您的代码、注释…

JDBC 批处理与事务处理:提升数据操作效率与一致性的密钥

目录 一. JDBC批量添加数据 1. 什么是批量添加数据 2. 实现数据的批量添加 a. 方式一&#xff1a;不分块 二. JDBC事务处理 1. 什么是事务 2. JDBC事务处理实现 三. 总结 前言 本文来讲解JDBC的批处理和事务处理 这对数据的安全性和准确性以及高效率提供很好的办法 话不…

C++实现Atbash密码

详细说明 埃特巴什密码是一种替换密码&#xff0c;在该密码中字母表中的字母是反向对应的。例如&#xff0c;A 会被替换为 Z&#xff0c;B 会被替换为 Y&#xff0c;依此类推。 #include <cassert> /// for assert #include <iostream> /// for IO operations #…

QuecPython+GNSS:实现快速定位

概述 QuecPython 结合 GNSS&#xff08;全球导航卫星系统&#xff09;模块为物联网设备提供开箱即用的定位能力解决方案。该方案支持 GPS/北斗/GLONASS/Galileo 多系统联合定位&#xff0c;为物联网开发者提供从硬件接入到云端服务的全栈式定位解决方案。 优势特点 多体系定…

leetcode刷题日记——逆波兰表达式求值

[ 题目描述 ]&#xff1a; [ 思路 ]&#xff1a; 借助栈的特性&#xff0c;遇见数字就将这个数压入栈内&#xff0c;遇见符号&#xff0c;就从栈中弹出两个数&#xff0c;进行相应的运算&#xff0c;然后将结果压入栈中运行如下 int evalRPN(char** tokens, int tokensSize…

firewalld 详解

firewalld 详解 firewalld 是 Linux 系统中一个动态防火墙管理工具&#xff0c;取代了传统的 iptables&#xff0c;提供更灵活、动态的规则配置&#xff0c;支持运行时修改且无需重载服务。以下是其核心概念、常用操作及示例指南&#xff1a; 一、核心概念 区域&#xff08;Zo…

面向高性能运动控制的MCU:架构创新、算法优化与应用分析

摘要&#xff1a;现代工业自动化、汽车电子以及商业航天等领域对运动控制MCU的性能要求不断提升。本文以国科安芯的MCU芯片AS32A601为例&#xff0c;从架构创新、算法优化到实际应用案例&#xff0c;全方位展示其在高性能运动控制领域的优势与潜力。该MCU以32位RISC-V指令集为基…

支付宝小程序组件与页面构造器使用指南:从页面到组件的正确迁移

引言 在支付宝小程序开发中&#xff0c;我们经常会遇到需要将页面组件化的情况。本文将通过一个实际案例&#xff08;将 /pages/plugin/device 从页面迁移到组件&#xff09;&#xff0c;深入分析支付宝小程序中页面和组件的区别&#xff0c;以及正确的迁移方式。我们将从问题…

26-算法打卡-字符串-右旋字符串-第二十六天

1 题目说明 字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k&#xff0c;请编写一个函数&#xff0c;将字符串中的后面 k 个字符移到字符串的前面&#xff0c;实现字符串的右旋转操作。 例如&#xff0c;对于输入字符串 &qu…

fastbev mmdetection3D 角度和方向损失

角度/方向损失 sin(a−b)sinacosb−cosasinb config参数 dir_offset0.7854, # pi/4 dir_limit_offset0, box编解码 # Copyright (c) OpenMMLab. All rights reserved. import torchfrom mmdet.core.bbox import BaseBBoxCoder from mmdet.core.bbox.builder import BBOX_COD…

极狐GitLab 如何 cherry-pick 变更?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 拣选(cherry-pick)更改 (BASIC ALL) 在 Git 中&#xff0c;cherry-pick 是从一个分支获取一个提交并将其添加为另一个分支的…