C语言每日一题(35)有效的括号

力扣网 20 有效的括号

题目描述

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

有效字符串需满足:

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

示例 1:

输入:s = "()"
输出:true

示例 2:

输入:s = "()[]{}"
输出:true

示例 3:

输入:s = "(]"
输出:false

思路分析

如果这里再用所谓的遍历字符串寻找进行匹配的话,时间复杂度高且不说,还麻烦,但如果我们学习栈了以后,这道题会变得异常轻松。

我们将所有的左括号入栈,在字符串里找右括号,同时出栈左括号进行匹配,如果匹配成功就返回true,否则返回false。

注意的问题:

这里除了括号类型的匹配问题,同时还有数量问题,会存在左括号多于右括号或者反过来的情况,这里如果数量不匹配的话也返回false。

判断数量的问题,再寻找右括号时,先判断栈是否为空,这是判断右括号多余左括号的情况,

在遍历一遍字符串后,如果栈里面还有括号,说明左括号多于右括号,也返回false。

完整代码

力扣环境下是不提供栈的,这里我们需要自己定义。

栈定义和常用接口

头文件

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>typedef char STDataType;typedef struct Stack
{STDataType* a;int _top;int _capacity;
}Stack;// 初始化栈
void StackInit(Stack* ps);
// 入栈
void StackPush(Stack* ps, STDataType data);
// 出栈
void StackPop(Stack* ps);
// 获取栈顶元素
STDataType StackTop(Stack* ps);
// 获取栈中有效元素个数
int StackSize(Stack* ps);
// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0
int StackEmpty(Stack* ps);
// 销毁栈
void StackDestroy(Stack* ps);

 接口实现文件

#include"Stack.h"// 初始化栈
void StackInit(Stack* ps)
{assert(ps);ps->a = NULL;ps->_capacity = 0;ps->_top = 0;
}// 入栈
void StackPush(Stack* ps, STDataType data)
{assert(ps);//检查是否栈满if (ps->_top == ps->_capacity){int newcapacity = ps->_capacity == 0 ? 4 : ps->_capacity * 2;Stack* ptr = realloc(ps->a, sizeof(STDataType) * newcapacity);if (ptr == NULL){perror("realloc fail");return;}ps->a = ptr;ps->_capacity = newcapacity;}//入栈ps->a[ps->_top] = data;ps->_top++;
}// 出栈
void StackPop(Stack* ps)
{assert(ps);assert(ps->_top > 0);ps->_top--;
}// 获取栈顶元素
STDataType StackTop(Stack* ps)
{assert(ps);assert(ps->_top > 0);return ps->a[ps->_top-1];
}// 获取栈中有效元素个数
int StackSize(Stack* ps)
{assert(ps);return ps->_top;
}
// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0
int StackEmpty(Stack* ps)
{assert(ps);if (ps->_top == 0){return 1;}else{return 0;}
}// 销毁栈
void StackDestroy(Stack* ps)
{assert(ps);free(ps->a);ps->_capacity = 0;ps->_top = 0;
}

题目所需代码

bool isValid(char* s) {Stack st;StackInit(&st);//初始化栈while (*s){if (*s == '{' || *s == '(' || *s == '[')//为左括号进栈{StackPush(&st, *s);}else{if (StackEmpty(&st))//如果为右括号,先判断栈是否为空{StackDestroy(&st);return false;}char top = StackTop(&st);//出栈栈顶括号StackPop(&st);if (*s == ']' && top != '[' ||//两者进行匹配,如果存在不等情况,返回false*s == '}' && top != '{' ||*s == ')' && top != '('){StackDestroy(&st);return false;}}++s;}bool ret = StackEmpty(&st);//最后再判断栈是否为空(左括号多余右括号情况),布尔值,如果栈为空返回真,否则返回假StackDestroy(&st);return ret;
}

 

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

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

相关文章

一个月B站涨粉200万,品牌号不可错过的吸粉秘籍

越来越多品牌为了持续在B站营销而创建品牌官方账号&#xff0c;发布原创作品融入B站UP主中&#xff0c;吸引B站用户塑造品牌形象&#xff0c;提高品牌传播度、品牌声量。 据飞瓜数据&#xff08;B站版&#xff09;统计&#xff0c;B站有着超过2万个品牌号&#xff0c;本篇文章…

C# Onnx PP-HumanSeg 人像分割

目录 效果 模型信息 项目 代码 下载 效果 图片源自网络侵删 模型信息 Inputs ------------------------- name&#xff1a;x tensor&#xff1a;Float[1, 3, 192, 192] --------------------------------------------------------------- Outputs -------------------…

好用的博客评论系统 Valine 使用及避坑指南

评论系统&#xff0c;即网站的一个小功能&#xff0c;展示评论内容和用户输入框。开源免费的评论系统可不多&#xff0c;原来很火的"多说"评论系统都关闭了&#xff0c;而Disqus又是国外的访问受限。无意间发现了Valine&#xff0c;挺不错的&#xff0c;分享给大家。…

内测分发平台的未来发展和趋势如何

大家好&#xff0c;我是咕噜-凯撒&#xff0c;随着软件开发行业的快速发展和更新迭代的频率不断加快&#xff0c;内测分发平台作为软件测试和发布的重要环节&#xff0c;将在未来扮演更加关键的角色。未来内测分发平台发展将呈现出一系列的新趋势,都有哪些方面呢。图片来源:new…

基于向量加权平均算法优化概率神经网络PNN的分类预测 - 附代码

基于向量加权平均算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于向量加权平均算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于向量加权平均优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xf…

DB2—03(DB2中常见基础操作)

DB2—03&#xff08;DB2中常见基础操作&#xff09; 1. 前言1.1 oracle和mysql相关 2. db2中的"dual"2.1 SYSIBM.SYSDUMMY12.2 使用VALUES2.3 SYSIBM.SYSDUMMY1 "变" dual 3. db2中常用函数3.1 nvl()、value()、COALESCE()3.2 NULLIF() 函数3.3 LISTAGG() …

Echarts实现散点图

效果图如下&#xff1a; <html><head><meta charsetutf-8><link rel"stylesheet" href"js/leaflet1.7.1/dist/leaflet.css"/><script src"js/leaflet1.7.1/dist/leaflet.js"></script><script src"…

2023年G2电站锅炉司炉证考试题库及G2电站锅炉司炉试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年G2电站锅炉司炉证考试题库及G2电站锅炉司炉试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人员上岗证考试大纲…

SpringBoot:邮件发送

官网文档&#xff1a;39. Sending Email (spring.io)。 Sending Email Spring框架提供了JavaMailSender实例&#xff0c;用于发送邮件。 如果SpringBoot项目中包含了相关的启动器&#xff0c;那么就会自动装配一个Bean实例到项目中。 在SpringBoot项目中引入如下Email启动器&a…

LeetCode算法题解(动态规划)|LeetCode343. 整数拆分、LeetCode96. 不同的二叉搜索树

一、LeetCode343. 整数拆分 题目链接&#xff1a;343. 整数拆分 题目描述&#xff1a; 给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 示例 1: 输入…

坚鹏:湘潭市银行业协会BLM银行数字化转型战略培训圆满结束

在数字化转型背景下&#xff0c;湘潭市银行业协会为了落实监管政策《关于银行业保险业数字化转型的指导意见》&#xff0c;充分认识到学习银行银行数字化转型战略的价值和重要性&#xff0c;特别举办《2023年数字化转型战略专题培训班》。为了改变大家的认知&#xff0c;为了拓…

VMware三种网络模式

桥接模式 NAT(网络地址转换模式) Host-Only(仅主机模式) 参考&#xff1a; vmware虚拟机三种网络模式 - 知乎 (zhihu.com)