leetcode 20.有效的括号

这篇具有很好参考价值的文章主要介绍了leetcode 20.有效的括号。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

⭐️ 题目描述

leetcode 20.有效的括号,刷题,leetcode,学习,栈,刷题
🌟 leetcode链接: 有效的括号

1️⃣ 代码与思路:

栈问题: 左括号进栈,如果是右括号则拿出栈顶元素比较,相同弹出栈顶元素,接着继续比较,不相同返回 false,还要考虑一些特殊情况,具体看如下代码。

注:由于C语言没有接口,所以手写了一套栈来使用。或者也可以使用静态数组模拟栈。文章来源地址https://www.toymoban.com/news/detail-535747.html


typedef char StackType;

typedef struct Stack {
	StackType* data;	
	int top;			// 栈顶
	int capacity;		// 容量
}Stack;
void StackInit(Stack * ps);
void StackDestroy(Stack * ps);
void StackPush(Stack* ps , StackType node);
void StackPop(Stack* ps);
bool StackEmpty(Stack* ps);
int StackSize(Stack* ps);
StackType StackTop(Stack * ps);

void StackInit(Stack* ps) {
	assert(ps);

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


void StackDestroy(Stack* ps) {
	assert(ps);

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


void StackPush(Stack* ps , StackType node) {
	assert(ps);

	// 检查容量
	if (ps->top == ps->capacity) {
		int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		StackType* newData = (StackType*)realloc(ps->data , sizeof(StackType) * newCapacity);
		assert(newData);
		ps->data = newData;
		ps->capacity = newCapacity;
	}

	ps->data[ps->top] = node;
	ps->top++;
}

void StackPop(Stack* ps) {
	assert(ps);

	// 判断栈是否为空
	assert(!StackEmpty(ps));

	ps->top--;
}

StackType StackTop(Stack* ps) {
	assert(ps);

	assert(!StackEmpty(ps));

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

bool StackEmpty(Stack* ps) {
	assert(ps);
	// 空为真,非空返回0
	return ps->top == 0;
}

int StackSize(Stack* ps) {
	assert(ps);

	return ps->top;
}

// 思路:左括号进栈 如果是右括号则拿出栈顶元素比较 以此类推...
bool isValid(char * s){
    Stack st;
    StackInit(&st);

    while (*s) {
        if (*s == '{' || *s == '[' || *s == '(') {
            // 进栈
            StackPush(&st , *s);
            s++;
        } else {
            // 特殊情况:如果栈为空 那么当前的右括号无匹配项 直接返回 fasle
            if (StackEmpty(&st)) {
                StackDestroy(&st);
                return false;
            }

            // 取栈顶元素
            StackType topElement = StackTop(&st);
            // 弹出栈顶元素
            StackPop(&st);
            if ( 
                (topElement == '{' && *s == '}') || 
                (topElement == '(' && *s == ')') ||
                (topElement == '[' && *s == ']')
            ) {
                s++;
            }
            else {
                StackDestroy(&st);
                return false;
            }
        }
    }

    // 如果循环结束 栈是空的 说明括号一对一对抵消了
    // 如果栈里有元素 说明括号没有完全匹配
    bool res = StackEmpty(&st);
    StackDestroy(&st);
    return res;

}

到了这里,关于leetcode 20.有效的括号的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Leetcode的AC指南 —— 栈与队列:20. 有效的括号

    摘要: **Leetcode的AC指南 —— 栈与队列:20. 有效的括号 **。题目介绍:给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 每个右括号都

    2024年01月22日
    浏览(42)
  • 数据结构与算法之字符串: Leetcode 20. 有效的括号 (Typescript版)

    有效的括号 https://leetcode.cn/problems/valid-parentheses/ 描述 给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 每个右括号都有一个对应的相

    2024年02月01日
    浏览(54)
  • 算法训练day11Leetcode20有效的括号1047删除字符串中所有相邻重复项150逆波兰表达式求值

    https://leetcode.cn/problems/valid-parentheses/description/ https://programmercarl.com/0020.%E6%9C%89%E6%95%88%E7%9A%84%E6%8B%AC%E5%8F%B7.html 判断右括号后忘记pop 括号匹配是使用栈解决的经典问题。 如果还记得编译原理的话,编译器在 词法分析的过程中处理括号、花括号等这个符号的逻辑,也是使用了栈

    2024年01月17日
    浏览(76)
  • 代码随想录第十一天 | ​​​​​​LeetCode 20. 有效的括号、​​​​​​LeetCode 1047. 删除字符串中的所有相邻重复项、​​​​​​LeetCode 150. 逆波兰表达式求

    目录 ​​​​​​LeetCode 20. 有效的括号 文章讲解:代码随想录(programmercarl.com) 视频讲解:栈的拿手好戏!| LeetCode:20. 有效的括号_哔哩哔哩_bilibili 思路 ​​​​​​LeetCode 1047. 删除字符串中的所有相邻重复项 文章讲解:代码随想录(programmercarl.com) 视频讲解:栈的好戏还

    2024年02月22日
    浏览(79)
  • Leetcode | 有效的括号、最长有效括号

    给定一个只包括  \\\'(\\\' , \\\')\\\' , \\\'{\\\' , \\\'}\\\' , \\\'[\\\' , \\\']\\\'  的字符串  s  ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 每个右括号都有一个对应的相同类型的左括号。 示例 1: 示例 2: 示例 3: 提示: 1

    2024年02月14日
    浏览(44)
  • 20. 有效的括号

    2024年02月07日
    浏览(40)
  • 20. 有效的括号(Java)

    给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 1.左括号必须用相同类型的右括号闭合。 2.左括号必须以正确的顺序闭合。 3.每个右括号都有一个对应的相同类型的左括号。 s = “()[]{}” true

    2024年02月01日
    浏览(41)
  • LeetCode——有效的括号

    这里,我提供一种用栈来解决的方法: 思路:栈的结构是先进后出,这样我们就可以模拟栈结构了,如果是‘(’、‘{’、‘[’任何一种,直接push进栈就可以了,如果是‘}’、‘)’、‘]’任何一种就开始判断,看栈pop的是否和对应的字符匹配。    下面是源码:    

    2024年02月11日
    浏览(48)
  • [Leetcode] 0020. 有效的括号

    点击上方,跳转至leetcode 给定一个只包括 \\\'(\\\' , \\\')\\\' , \\\'{\\\' , \\\'}\\\' , \\\'[\\\' , \\\']\\\'  的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 每个右括号都有一个对应的相同类型的左括号。 示例 1: 示例 2:

    2024年02月10日
    浏览(44)
  • Leetcode 678. 有效的括号字符串

    有效的括号字符串 【问题描述】 给你一个只包含三种字符的字符串,支持的字符类型分别是 ‘(’、‘)’ 和 ‘*’。请你检验这个字符串是否为有效字符串,如果是有效字符串返回 true 。 有效字符串符合如下规则: 示例 1: 输入:s = “()” 输出:true 示例 2: 输入:s = “

    2024年02月13日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包