【LeetCode刷题指南】--有效的括号

🔥个人主页:@草莓熊Lotso

🎬作者简介:C++研发方向学习者

📖个人专栏:************************************************************************************************************************************************************************************************************************************************************《C语言》《数据结构与算法》《C语言刷题集》《Leetcode刷题指南》****************************************************************************************************************************************************************************************************************************************************************

⭐️人生格言:生活是默默的坚持,毅力是永久的享受。

前言:随着编程相关知识点的学习,我们LeetCode的刷题也不能落下。在前面我们也接触到了洛谷和牛客这两个刷题网站,但是博主一直都在推荐大家使用力扣,是因为力扣的判题严谨且大部分都是接口型题目,与面试中的笔试题也更加贴合。那么还是老样子,博主会为大家提供我自己的思路和代码,但是算法题的解法肯定不止一个,欢迎大家一起交流和讨论。


目录

有效的括号

解题过程:

代码演示:


有效的括号

题目链接: 20. 有效的括号 - 力扣(LeetCode)

题目描述:

题目示例:

**思路:**借助数据结构-栈,遍历字符串,左括号入栈,右括号取栈顶元素进行比较,看是否匹配

解题过程:

1.遍历字符串,左括号就入栈,右括号就取栈顶元素

2.前提是不为空才能取,如果为空证明前面没有左括号直接销毁返回false

3.如果不为空,取栈顶元素进行匹配,出现匹配不成功的销毁后返回false

4.如果本次匹配成功,出栈,继续遍历

5.遍历完后进行判空,如果栈为空证明全部匹配上了,返回true,如果不为空则返回false

复杂度:

  • 时间复杂度: O(n)
  • 空间复杂度: O(∗)

代码演示:

cpp 复制代码
typedef char STDataType;
typedef struct Stack
{
	STDataType* arr;
	int top;
	int capacity;
}ST;

//初始化
void STInit(ST* ps)
{
	ps->arr = NULL;
	ps->top = ps->capacity = 0;
}

//销毁
void STDestory(ST* ps)
{
	if (ps->arr)
		free(ps->arr);
	ps->top = 0;
	ps->capacity = 0;
}

//入栈
void STPush(ST* ps, STDataType x)
{
	assert(ps);
	//检查空间
	//空间不够就增容
	if (ps->top == ps->capacity)
	{
		int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;
		STDataType* tmp = (STDataType*)realloc(ps->arr, newcapacity * sizeof(STDataType));
		if (tmp == NULL)
		{
			perror("realloc fail!");
			exit(1);
		}
		ps->arr = tmp;
		ps->capacity = newcapacity;
	}
	//空间足够
	ps->arr[ps->top++] = x;
}

//出栈
void STPop(ST*ps)
{
	//
	ps->top--;
}

//取栈顶元素
STDataType STTop(ST* ps)
{
	return 	ps->arr[ps->top - 1];;
}

//判空
bool STEmpty(ST* ps)
{
	assert(ps);
	return ps->top == 0;
}

//求栈中有效数据个数
int STSize(ST* ps)
{
	assert(ps);
	return ps->top;
}

//----------------------以上是栈结构常用接口--------------------------------
bool isValid(char* s) {
    ST st;
    STInit(&st);
    char*pi=s;
    while(*pi!='\0')
    {
        if(*pi=='('||*pi=='['||*pi=='{')
        {
            STPush(&st,*pi);
        }
        else{
            //右括号取栈顶元素进行匹配
            //栈不为空才能取
            if(STEmpty(&st))
            {
                STDestory(&st);
                return false;
            }
            char top=STTop(&st);
            if((top=='('&&*pi!=')')
              ||(top=='['&&*pi!=']')
              ||(top=='{'&&*pi!='}'))
             {
                STDestory(&st);
                return false;
             }
        //本次匹配就出栈
        STPop(&st);
        }
        pi++;
    }
    //为空有效,非空无效
    bool ret=STEmpty(&st)?true:false;
    STDestory(&st);
    return ret;
}

这里用到了栈的结构,大家如果使用C语言写的话可以把我们之前自己实现的栈直接拷贝上去


往期回顾:

【数据结构初阶】--双向链表(一)

​​​​​​【数据结构初阶】--双向链表(二)

【LeetCode刷题指南】--随机链表的复制

结语:本篇文章就到此结束了,《LetetCode刷题指南》中的题目比起之间的C语言刷题集中的题目,肯定会更加复杂一些。而且题目形式也不一样,大家需要注意一下。如果文章对你有帮助的话,欢迎评论,点赞,收藏加关注,感谢大家的支持

相关推荐
丶小鱼丶1 小时前
栈算法之【有效括号】
java·算法
技术卷4 小时前
详解力扣高频 SQL 50 题之584. 寻找用户推荐人【入门】
sql·leetcode·oracle
小徐不徐说4 小时前
每日一算:华为-批萨分配问题
数据结构·c++·算法·leetcode·华为·动态规划·后端开发
菜鸟555556 小时前
图论:最小生成树
算法·图论
阿捏利7 小时前
【加解密与C】Rot系列(四)Rot8000
c语言·rot8000
2401_872945097 小时前
【补题】Codeforces Round 735 (Div. 2) C. Mikasa
算法
叫我:松哥7 小时前
基于网络爬虫的在线医疗咨询数据爬取与医疗服务分析系统,技术采用django+朴素贝叶斯算法+boostrap+echart可视化
人工智能·爬虫·python·算法·django·数据可视化·朴素贝叶斯
Star在努力7 小时前
14-C语言:第14天笔记
c语言·笔记·算法
程序员编程指南8 小时前
Qt 与 SQLite 嵌入式数据库开发
c语言·数据库·c++·qt
赴3359 小时前
Numpy 库 矩阵数学运算,点积,文件读取和保存等
人工智能·算法·numpy·random·dot