有效的括号(oj题)

一、题目链接

https://leetcode.cn/problems/valid-parentheses/submissions/538110206


 

二、题目思路

利用栈的性质,后进先出

1.依次读取字符串,判断是否为左括号,如果是,就将其入栈。

2.如果读取的不是左括号,就说明是右括号了。这时要在栈不为空的情况下,去取栈的栈顶元素,判断栈顶元素是否和此时读取的右括号之间是否配对。

3.如果配对,就让栈顶的左括号出栈

4.重复循环,直至字符串读取完,或者在读完之前,就直接就判断出了匹配错误的结果

6.最后要判断是否栈是否为空栈,如果是空栈,就说明所有扩号是匹配成功的,就返回true 

如果不为空,就返回false

注意:如果字符串都是右括号,这样就没有元素入栈,最后判断栈为空,得到了错误的结果

所以:

要在取栈顶元素判断之前,要判断栈是否为空,为空,就说明第一个字符是右括号,就直接代表匹配失败,直接返回false

三、题解代码

typedef char StackDataType;
typedef struct stack {
    StackDataType* data;
    int size;
    int capacity;
} Stack;
void stackInit(Stack* pst);
void stackDestroy(Stack* pst);
void checkCapacity(Stack* pst);
int stackIsEmpty(Stack* pst);
void stackFush(Stack* pst, StackDataType data);
void stackPop(Stack* pst);
StackDataType stackTop(Stack* pst);
int stackSize(Stack* pst);
void stackInit(Stack* pst) {
    pst->data = NULL;
    pst->size = 0;
    pst->capacity = 0;
}
void stackDestroy(Stack* pst) {
    free(pst->data);
    pst->data = NULL;
    pst->capacity = 0;
    pst->size = 0;
}
void checkCapacity(Stack* pst) {
    if (pst->size == pst->capacity) {
       int newcapacity = pst->capacity == 0 ? 4 : 2 * pst->capacity;
        StackDataType* p = (StackDataType*)realloc(pst->data,
            sizeof(StackDataType) * newcapacity);
        if (p == NULL) {
            perror("realloc fail");
            return;
        }
        pst->data = p;
        pst->capacity = newcapacity;
    }
}
int stackIsEmpty(Stack* pst) {
    if (pst->size == 0)
        return 1;
    else
        return 0;
}
void stackFush(Stack* pst, StackDataType data) {
    checkCapacity(pst);
    pst->data[pst->size] = data;
    pst->size++;
}
void stackPop(Stack* pst) {
    pst->size--;
}
StackDataType stackTop(Stack* pst) {
    return pst->data[pst->size - 1];
}
int stackSize(Stack* pst) {
    return pst->size;
}
bool isValid(char* s) {
    // write code here
    Stack sta;
    stackInit(&sta);
    while (*s) {
        if (*s == '(' || *s == '[' || *s == '{')//读入左括号
            stackFush(&sta, *s);//左括号入栈
        else {
            
        //     //如果第一个是右括号,进不了栈,说明栈为空,直接返回false
            if(stackIsEmpty(&sta))
               return false;

            if (!stackIsEmpty(&sta)) {
                StackDataType temp = stackTop(&sta);//取栈顶元素

                //如果栈顶元素无法与之匹配,就说明失败了
                if (*s == ')' && temp != '(')
                    return false;
                else if (*s == ']' && temp != '[')
                    return false;
                else if (*s == '}' && temp != '{')
                    return false;
                else
                    stackPop(&sta);  //出栈,更新栈顶元素
            }
        } 
        s++;//移动字符指针
    }
    if (stackIsEmpty(&sta))
        return true;  //如果最后栈为空,就说明成功
    else
        return false;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

c++编译器在什么情况下会提供类的默认构造函数等,与析构函数

我们都知道,在 c 里,编写的简单类,若没有自己编写构造析构函数与 copy 构造函数 与 赋值运算符函数,那么编译器会提供这些函数,并实现简单的语义,比如成员赋值。看 源码时,出现了下图类似的情形…

如何使用Python的Turtle模块绘制小猪

一、前置条件 在开始学习如何使用Python的Turtle模块进行绘画之前,请确保你的电脑已安装Python环境。如果尚未安装Python,你可以从Python官网下载并安装最新版本。 Turtle模块是Python内置的一个用于绘图的库,通常不需要额外安装。如果你发…

vivado DIAGRAM、HW_AXI

图表 描述 块设计(.bd)是在IP中创建的互连IP核的复杂系统 Vivado设计套件的集成商。Vivado IP集成器可让您创建复杂的 通过实例化和互连Vivado IP目录中的IP进行系统设计。一块 设计是一种分层设计,可以写入磁盘上的文件(.bd&…

【TB作品】MSP430F5529 单片机,数字时钟设计与实现,整点时通过蜂鸣器播放音乐进行报时

基于单片机的数字时钟设计与实现 作品名称 基于MSP430单片机的OLED显示数字时钟 作品功能 本作品实现了一个具有时间显示和整点报时功能的数字时钟。通过OLED屏幕显示当前时间,用户可以通过按键设置时间,并在整点时通过蜂鸣器播放音乐进行报时。 作…

vue处理json数据

背景:后端返回的数据不是我想要的,现在需要把 name 替换为title(小声蛐蛐:又让我处理数据) 后端返回数据格式 修改字段操作:(使用递归遍历的方式将title属性赋了name的值) renderT…

八、【源码】细化XML语句构建器,完善静态SQL解析

源码地址:https://github.com/mybatis/mybatis-3/ 仓库地址:https://gitcode.net/qq_42665745/mybatis/-/tree/08-optimize-xml-parse 细化XML语句构建器,完善静态SQL解析 这一节主要是优化XML解析SQL部分,流程大概为&#xff…

【Java】解决Java报错:NumberFormatException

文章目录 引言1. 错误详解2. 常见的出错场景2.1 字符串包含非数字字符2.2 空字符串或 null 字符串2.3 数值超出范围 3. 解决方案3.1 验证字符串格式3.2 使用异常处理3.3 处理空字符串和 null 4. 预防措施4.1 数据验证4.2 编写防御性代码4.3 单元测试 结语 引言 在Java编程中&a…

认识Java中的String类

前言 大家好呀,本期将要带大家认识一下Java中的String类,本期注意带大家认识一些String类常用方法,和区分StringBuffer和StringBuilder感谢大家收看 一,String对象构造方法与原理 String类为我们提供了非常多的重载的构造方法让…

通过抑制治疗上调的环氧化酶-2来改善光动力性能的肿瘤归巢嵌合肽菱形体

引用信息 文 章:Tumor Homing Chimeric Peptide Rhomboids to Improve Photodynamic Performance by Inhibiting Therapy‐Upregulated Cyclooxygenase-2. 期 刊:Smal(影响因子:13.3) 发表时间&#xff1a…

Point-LIO:鲁棒高带宽激光惯性里程计

1. 动机 现有系统都是基于帧的,类似于VSLAM系统,频率固定(例如10Hz),但是实际上LiDAR是在不同时刻进行顺序采样,然后积累到一帧上,这不可避免地会引入运动畸变,从而影响建图和里程计精度。此外…

Duilib多标签选项卡拖拽效果:添加动画特效!

动画是小型界面库的“难题”、“通病” 几年前就有人分享了如何用direct UI制作多标签选项卡界面的方法。还有人出了一个简易的浏览器demo。但是他们的标签栏都没有Chrome浏览器那样的动画特效。 如何给界面添加布局是的动画特效呢? 动画使界面看起来高大上&#…

C++笔试强训day41

目录 1.棋子翻转 2.宵暗的妖怪 3.过桥 1.棋子翻转 链接https://www.nowcoder.com/practice/a8c89dc768c84ec29cbf9ca065e3f6b4?tpId128&tqId33769&ru/exam/oj (简单题)对题意进行简单模拟即可: class Solution { public:int dx[…

2024年政治经济学与社会科学国际会议(ICPESS 2024)

2024年政治经济学与社会科学国际会议 2024 International Conference on Political Economy and Social Sciences 会议简介 2024年政治经济学与社会科学国际会议是一个致力于探讨政治经济学与社会科学交叉领域前沿问题的国际盛会。本次会议汇聚了全球顶尖的专家学者、研究人员和…

lubuntu / ubuntu 配置静态ip

一、查看原始网络配置信息 1、获取网卡名称 ifconfig 2、查询网关IP route -n 二、编辑配置文件 去/etc/netplan目录找到配置文件,配置文件名一般为01-network-manager-all.yaml sudo vim /etc/netplan/01-network-manager-all.yaml文件打开后内容如下 # This …

【优化过往代码】关于vue自定义事件的运用

【优化过往代码】关于vue自定义事件的运用 需求说明过往代码优化思路优化后代码(Vue2)遇到问题记录 Vue2官方自定义指令说明文档 Vue3官方自定义指令说明文档 需求说明 进入某些页面需要加载一些外部资源,并在资源加载完后进行一些处理&…

Flink⼤状态作业调优实践指南:状态报错与启停慢篇

摘要:本文整理自俞航翔、陈婧敏、黄鹏程老师所撰写的大状态作业调优实践指南。由于内容丰富,本文分享终篇状态报错与启停慢篇,主要分为以下四个部分: 检查点和快照超时的诊断与调优 作业快速启动和扩缩容方案 总结 阿里云企业级…

图解支付系统全自动化渠道开关设计与实现

大家好,我是隐墨星辰,前几天在渠道路由章节中提到过自动化渠道开关,今天聊聊支付系统中全自动化渠道开关的设计与实现。主要讲清楚在什么情况下需要考虑建设自动化渠道开关,以及如何设计并实现一个平衡灵敏度和噪音的自动化渠道开…

用python编撰一个电脑清理程序

自制一个电脑清理程序,有啥用呢?在电脑不装有清理软件的时候,可以解决自己电脑内存不足的情况。 1、设想需要删除指定文件夹中的临时文件和缓存文件。以下是代码。 import os import shutil def clean_folder(folder_path): for root,…

Qt基于SQLite数据库的增删查改demo

一、效果展示 在Qt创建如图UI界面,主要包括“查询”、“添加”、“删除”、“更新”,四个功能模块。 查询:从数据库中查找所有数据的所有内容,并显示在左边的QListWidget控件上。 添加:在右边的QLineEdit标签上输入需…

分享一个按钮代码,主要有html,svg及css动画实现

按钮展示: Switch by Galahhad made with CSS | Uiverse.io 源代码: css .theme-switch {--toggle-size: 30px;/* the size is adjusted using font-size,this is not transform scale,so you can choose any size */--container-width: 5.625em;--container-height: 2.5em;-…