leetcode--有效的括号

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

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。

示例 1:

输入: “()”
输出: true

示例 2:

输入: “()[]{}”

输出: true

示例 3:

输入: “(]”
输出: false

示例 4:

输入: “([)]”
输出: false

示例 5:

输入: “{[]}”

输出: true

在讲解这道题的时候我们先了解以下什么是栈结构。

栈结构

栈是一个很重要的结构,他遵循先进后出的原则在很多工程中都会用到。我们熟悉的递归其实也就是压栈的过程,系统将这次程序的全部信息压入到栈中,在执行自身的下一次程序,等到不满足递归条件的时候在逐层接着往下运行。

假设有这样一个程序,输入一个数,不断的让这个数减到0,如果不为0就重新执行自身直到0为止就返回(当让这个题正常用循环就可以做,循环也是比递归更佳的方法,但是为了通过递归讲解栈结构才引用的)

int Recursive(int num)
{
	if (num == 0)
		return num;
	Recursive(--num);
	cout << num << endl;
}

在这里插入图片描述

这个就是递归的时候压栈和弹栈的过程,如果一个程序可以使用for循环来做这是很好的,因为在压栈的过程中,不仅仅压入的是num的值,还有一些其他的东西。所以会比较占用空间。

不管是C++,java,还是python都是自带栈结构。C语言自行百度就不多赘述。

回到这道题就是使用栈结构来解的。

思路:

  • 遍历这个字符串,如果遇到左括号(’(‘,’[’,’{’)那么我们就往栈中压入对应的右括号(’)’,’]’,’}’’)
  • 遇到不是左括号的时候我们就比较栈顶和这个右括号,如果相等则弹出栈,接着往后遍历
  • 遇到不相等的直接返回false
  • 如果遇到的是右括号并且此时栈为空,那么也是返回false
  • 跳出循环的时候如果栈为空则返回true,否则返回false
class Solution {
public:
    bool isValid(string s) 
    {
        if (!s.length())
                return true;
        stack<char> stk;
        for (int i = 0; i < s.length(); i++)
        {
            
            if (s[i] == '(')
                stk.push(')');
            else if (s[i] == '[')
                stk.push(']');
            else if (s[i] == '{')
                stk.push('}');
            else
            {
                if (stk.empty()||stk.top() != s[i])
                    return false;

                else
                    stk.pop();
            }	
        }
        return stk.empty();
        }
};

今天的讲解就到这,我是小白。欢迎关注我的公众号我们一起变强。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值