当前位置: 首页 > news >正文

有效的括号(栈)

有效的括号(栈)

题目描述

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

    有效字符串需满足:

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

    输入:s = “()”

    输出:true

    示例 2:

    输入:s = “()[]{}”

    输出:true

    示例 3:

    输入:s = “(]”

    输出:false

    示例 4:

    输入:s = “([])”

    输出:true

  • 提示:

    • 1 <= s.length <= 10^4
    • s 仅由括号 '()[]{}' 组成
  • 然后题目提供了一个函数

  • bool isValid(char* s) {
        
    }
    

答案

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>

typedef int SKDataType;
typedef struct Stack
{
    SKDataType *a;
    int top;//栈顶下标
    int capacity;//容量
}SK;

//初始化栈
void SKInit(SK* ps);
//销毁栈
void SKDestroy(SK* ps);

//插入数据,压栈
void SKPush(SK* ps,SKDataType x);
//删除数据,出栈
void SKPop(SK* ps);
//获取现在栈顶元素的值
SKDataType SKTop(SK* ps);

//栈的大小
int SKSize(SK* ps);
//判断栈是否为空
bool SKEmpty(SK* ps);

//初始化栈
void SKInit(SK* ps)
{
    assert(ps);

    ps->a=NULL;
    ps->capacity=0;
    ps->top=0;
}

//销毁栈
void SKDestroy(SK* ps)
{
    assert(ps);

    free(ps->a);
    ps->a=NULL;
    ps->top=ps->capacity=0;
}

//插入数据,压栈
void SKPush(SK* ps,SKDataType x)
{
    assert(ps);


    if(ps->top==ps->capacity)
    {
        int newCapacity=ps->capacity==0 ? 4 :ps->capacity*2;
        SKDataType * tmp=(SKDataType*) realloc(ps->a,sizeof (SKDataType)*newCapacity);
        if(tmp==NULL)
        {
            perror("realloc failed");
            exit(-1);
        }

        ps->a=tmp;
        ps->capacity=newCapacity;
    }

    ps->a[ps->top]=x;
    ps->top++;
}

//删除数据,出栈
void SKPop(SK* ps)
{
    assert(ps);

    assert(ps->top>0);

    ps->top--;
}

//获取现在栈顶元素的值
SKDataType SKTop(SK* ps)
{
    assert(ps);

    assert(ps->top>0);

    return ps->a[ps->top-1];
}

//栈的大小
int SKSize(SK* ps)
{
    assert(ps);

    return ps->top;
}

//判断栈是否为空
bool SKEmpty(SK* ps)
{
    assert(ps);

    return ps->top==0;
}

bool isValid(char* s) {
    SK st;
    SKInit(&st);
    char topval;

    while(*s)
    {
        if(*s=='('||*s=='['||*s=='{')
        {
            SKPush(&st,*s);
        }
        else
        {
            //数量不匹配
            if(SKEmpty(&st))
            {
                SKDestroy(&st);
                return false;
            }

            topval=SKTop(&st);
            SKPop(&st);
            if((*s==']'&&topval!='[')
            ||(*s==')'&&topval!='(')
            ||(*s=='}'&&topval!='{'))
            {
                SKDestroy(&st);
                return false;
            }
        }
        s++;
    }

    //判断栈是否为空,不为空则说明数量不匹配
    bool ret =SKEmpty(&st);
    SKDestroy(&st);

    return ret;
}

思路解析

请添加图片描述

  • 具体的过程如下:
    请添加图片描述
    在这里插入图片描述

相关文章:

  • 【论文阅读笔记】ALSS-YOLO | 无人机(UAVs)、热红外(TIR)、野生动物探测、小目标、轻量级探测器
  • 【Node.js入门笔记1---初始Node.js)】
  • 笔记:代码随想录算法训练营day37:完全背包、518. 零钱兑换 II、377. 组合总和 Ⅳ、70. 爬楼梯 (进阶)
  • Python--网络编程(下)
  • GPTQ - 生成式预训练 Transformer 的精确训练后压缩
  • C++编程指南23 - 在无关线程之间共享资源时应使用shared_ptr
  • IntelliJ IDEA 华为云远程开发配置步骤
  • 通用文件模型
  • Axure设计之数据列表动态列设置/列筛选案例
  • 设计模式Python版 状态模式
  • 开发者社区测试报告(功能测试+性能测试)
  • 尚硅谷爬虫note14
  • ZooKeeper 基本概述
  • 意向锁的目的
  • 探索数据仓库自动化:ETL流程设计与实践
  • 【Pandas】pandas Series swaplevel
  • Python爬虫实战:一键采集电商数据,掌握市场动态!
  • 自然语言处理(NLP)中文文本预处理主流方法
  • python中采用opencv作常规的图片处理的方法~~~
  • 华为OD机试-发现新词的数量(Java 2024 E卷 100分)
  • 网站建设与应用 教案/搜索引擎的优化和推广
  • 网站 app/广告模板
  • 用什么做网站更快捷方便/自己怎么做引流推广
  • 自适应网站好建们/贵阳百度推广电话
  • 成都html5网站建设/短视频seo关键词
  • 我是做装修的怎么样投资网站/搜索引擎优化的根本目的