(动画详解)LeetCode20.有效的括号

题目描述

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

解题思路

栈的方法

遍历整个字符串

当检测到左括号的时候,就让左括号入栈

当检测到右括号的时候,就让左括号出栈与右括号对比

如果相等则继续比较直到结束,如果不相等就直接返回false

当匹配到右括号但栈中已经没有相应的左括号与之对应时就说明右括号多于左括号,那么饭返回false

当遍历结束后如果发现栈中还有元素,那么说明左括号多于右括号,返回fasle

分析完之后,我们决定定义一个栈来完成这道题,下面是需要的函数

StackInit,用于初始化栈

StackDestroy,用于释放内存,其他语言不用考虑,这里用C语言来实现

StackPush,用于向栈顶推入数据

StackPop,用于弹出栈顶数据

StackTop,用于返回栈顶元素

动画详解

先以'('和')'为例进行演示,这是最简单的一种情况

接着我们来看一个比较复杂的场景

示例( ( [ [ ] ] ) )  

那么下面我们来分析失败的情况

示例  (  )  (  ]

下面我们来看看括号个数不一致的情况

第一种情况是左括号多于右括号

示例  (  (  (  )  )

 

接下来就是右括号多于左括号的情况了

示例  (  (  )  )  )

 

代码实现

// 创建栈
typedef char STDataType;

struct Stack
{
	STDataType* x;
	int top;
	int capacity;
};

typedef struct Stack ST;

void StackInit(ST* pst)
{
	assert(pst);
	pst->x = NULL;
	pst->capacity = 0;
	// top指向的是栈顶元素的下一个位置
	pst->top = 0;
	// top指向的是当前的栈的元素
	/*pst->top = -1;*/
}

void StackDestroy(ST* pst)
{
	assert(pst);
	free(pst->x);
	pst->x = NULL;
	pst->capacity = pst->top = 0;
}

// 获取栈顶元素
STDataType StackTop(ST* pst)
{
	assert(pst);
	assert(pst->top > 0);
	return pst->x[pst->top-1];
}

void StackPush(ST* pst, STDataType x)
{
	assert(pst);
	// 扩容
	// top和capacity相等时说明没有容量了
	if (pst->top == pst->capacity)
	{
		// 判断容量是否为空
		int newcapacity = pst->capacity==0 ? 4 : pst->capacity * 2;
		STDataType* new = (STDataType*)realloc(pst->x,newcapacity * sizeof(STDataType));
		if (new == NULL)
		{
			perror("realloc failed");
            return;
		}
		pst->x = new;
		pst->capacity = newcapacity;
	}
	pst->x[pst->top] = x;
	pst->top++;
}

// 出栈
void StackPop(ST* pst)
{
	assert(pst);
	assert(pst->top > 0);
	pst->top--;
}

// 判断栈是否为空
bool StackEmpty(ST* pst)
{
	assert(pst);
	return pst->top == 0;
}

bool isValid(char* s)
{
    ST 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);
            //如果不匹配,那么就直接返回fasle
            if((top=='('&&*s!=')')
            ||(top=='['&&*s!=']')
            ||(top=='{'&&*s!='}'))
            {
                return false;
            }
            
        }
        s++;
    }

    bool ret = StackEmpty(&st);
    return ret;
    StackDestroy(&st);
    return 0;
}

复杂度分析

我们很容易发现,关于栈的几个函数时间复杂度都近似为O(1),而仅有isValid函数中存在while循环,所以这个代码的时间复杂度为O(n)

总结

Bye!!

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

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

相关文章

在Linux中安装Docker

如果之前安装过旧版本的 Docker,可以使用下面命令卸载: yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-selinux \docker-engine-selinux \docker-engine…

[华为OD]C卷 BFS 亲子游戏 200

题目: 宝宝和妈妈参加亲子游戏,在一个二维矩阵(N*N)的格子地图上,宝宝和妈妈抽签决定各自 的位置,地图上每个格子有不同的Q糖果数量,部分格子有障碍物。 游戏规则Q是妈妈必须在最短的时间&a…

我独自升级崛起账号注册 我独自升级怎么注册账号

近期,《我独自升级》这部动画凭借爆棚的人气,在各大平台上掀起了一阵观看热潮,其影响力不容小觑。借此时机,韩国游戏巨头网石集团敏捷响应,顺势推出了同名游戏《我独自升级:ARISE》,为粉丝们搭建…

淘宝/天猫商品描述API(taobao.item_get_desc)返回值详解

淘宝/天猫的商品描述API(taobao.item_get_desc)允许开发者获取指定商品的详细描述信息。这对于需要进行商品数据分析、构建商品详情页面或进行其他与商品相关的应用开发非常有用。下面,我们将详细解析这个API的返回值。 一、API概述 taobao.…

接收区块链的CCF会议--NDSS 2025 截止7.10 附录用率

会议名称:Network and Distributed System Security Symposium (NDSS) CCF等级:CCF A类学术会议 类别:网络与信息安全 录用率:2024年接收率19.5% Submissions are solicited in, but not limited to, the following areas: Ant…

【Qt】掌握Qt界面开发:窗口属性与资源嵌入技巧解析

文章目录 前言:1. windowTitle: 窗口标题2. windowIcon:窗口图标3. qrc 机制:4. windowOpacity:半透明效果总结: 前言: 在软件开发中,用户界面(UI)的构建是一个重要环节…

Deepsort算法研究

目录 1. 基于检测的多目标跟踪策略 1.1 多目标跟踪任务模型 1.2 多目标跟踪算法 SORT 1.3 DeepSORT 算法 2 . 基于轨迹的学生行为分类模型 2.1 学生行为分类规则 2.2 实际场景分析 1. 基于检测的多目标跟踪策略 多目标跟踪任务涉及跟踪多个目标的身份信息关联&#x…

C++类和对象(基础篇)

前言: 其实任何东西,只要你想学,没人能挡得住你,而且其实学的也很快。那么本篇开始学习类和对象(C的,由于作者有Java基础,可能有些东西过得很快)。 struct在C中的含义: …

组件通信-props详解

目录 一、什么是prop 二、props校验 三、组件中prop和data的区别 一、什么是prop Prop定义:组件上注册的一些自定义属性。 Prop作用:向子组件传递数据。 特点: 可以传递任意数量的prop可以传递任意类型的prop 二、props校验 组件的pr…

智能化采购管理系统助力光伏行业提高效率

光伏行业是指太阳能电池板的制造、安装和维护等相关产业,是新能源领域的重要组成部分。近年来,随着全球对于环保和可持续发展的重视,光伏行业进入全球化和智能化的新阶段。光伏企业开始加强国际合作,推广智能化技术,提…

数据结构学习/复习11--二叉树分治与递归思想练习题

一、二叉树相关练习题 1.判断单值二叉树 2. 判断两颗树是否相同 3.先序遍历的实现 注意事项:此处中的数组的下标用指针控制,因为受到递归与函数栈帧创建与销毁的影响。最后的返回值是指向前序遍历排好后的数组指针 4.判断一棵树是否是另一棵树的子树 …

速来get!多微信聚合聊天功能大揭秘!

随着网络时代的发展,微信成为了职场中不可或缺的沟通工具,很多人都有着多个微信号,而要想高效管理这些账号,那就少不了工具的帮忙。 通过微信管理系统,可以轻松实现多个微信号聚合聊天,提高沟通效率。 1、…

电商风口的最后一班快车?有些人甚至正在All in视频号!

我是王路飞。 当抖音、快手、淘宝上的商家还在内卷的时候,有些人却转移了阵地,搭上了电商风口的“最后一般列车”,甚至正在All in 视频号。 内容来源于【醒醒团队-电商王路飞】 随着“微视”想要三分天下野心的失败(与抖音、快手…

ansible 深入介绍之 主机清单与playbook

目录​​​​​​​ 一 inventory 主机清单 1,主机清单 是什么 2,主机清单 定义方式 2.1 自定义主机端口 2.2 定义 范围ip 地址 2.3 定义 拥有相似的主机名 3, inventory 中的变量 3.1 常见 变量 3.2 主机变量 3.3 组变量 3.…

c语言练习5.8

1.分析代码 VS开发环境调试下面的代码&#xff0c;画图解释下面代码的问题 #include <stdio.h> int main() {int i 0;int arr[] {1,2,3,4,5,6,7,8,9,10};for(i0; i<12; i){arr[i] 0;printf("hello bit\n");}return 0; } 分析: 2.喝汽水问题 喝汽水&a…

Python数据可视化------地图

基础地图使用 # 地图基本演示 # 导包 from pyecharts.charts import Map from pyecharts.options import TitleOpts, VisualMapOpts# 准备地图对象 cmap Map() # 准备数据&#xff08;列表&#xff09; data [("北京市", 99), ("上海市", 199), ("…

淘宝扭蛋机小程序,开启你的惊喜探索之旅!

亲爱的淘宝用户们&#xff0c;我们非常高兴地宣布&#xff0c;全新的淘宝扭蛋机小程序即将上线&#xff01;这是一款集合了趣味、惊喜与购物乐趣于一体的创新应用&#xff0c;让你在淘宝的海洋里&#xff0c;找到那份独特的快乐。 一、淘宝扭蛋机小程序是什么&#xff1f; 淘…

后端常用技能:解决java项目前后端传输数据中文出现乱码、问号问题

0. 问题背景 最近做一个解析数据的小工具&#xff0c;本地运行时都正常&#xff0c;发布到服务器上后在导出文件数据时发现中文全部变成了问号&#xff0c;特此记录下问题解决的思路和过程 1. 环境 java 1.8 springboot 2.6.13 额外引入了fastjson&#xff0c;commons-csv等…

Linux网络编程:TCP编程实现

目录 1、前言 2、函数介绍 2.1 socket函数 与 通信域 2.2 bind函数 与 通信结构体 2.2.1 domain通信地址族 与 通信结构体 2.2.2 IPv4地址族结构体 2.2.3 通用地址族结构体 2.2.4 示例&#xff1a;为套接字fd绑定通信结构体addr 2.3 listen函数 与 accept函数 …

onlyoffice容器打包成镜像

书接上篇&#xff0c;onlyoffice容器已经更改在本地docker环境中了&#xff0c;之后需要部署到测试环境的docker中&#xff0c;采用容器打包成本地镜像 1、本地docker 查看容器&#xff1a;docker ps 生成镜像&#xff1a;docker commit -p blissful_lichterman 重命名镜像&a…