数据结构之堆栈 力扣简单题讲解(C++实现)

题目一:如果字符串满足以下条件之一,则可以称之为 有效括号字符串(valid parentheses string,可以简写为 VPS):

字符串是一个空字符串 "",或者是一个不为 "(" 或 ")" 的单字符。
字符串可以写为 AB(A 与 B 字符串连接),其中 A 和 B 都是 有效括号字符串 。
字符串可以写为 (A),其中 A 是一个 有效括号字符串 。
类似地,可以定义任何有效括号字符串 S 的 嵌套深度 depth(S):

depth("") = 0
depth(C) = 0,其中 C 是单个字符的字符串,且该字符不是 "(" 或者 ")"
depth(A + B) = max(depth(A), depth(B)),其中 A 和 B 都是 有效括号字符串
depth("(" + A + ")") = 1 + depth(A),其中 A 是一个 有效括号字符串
例如:""、"()()"、"()(()())" 都是 有效括号字符串(嵌套深度分别为 0、1、2),而 ")(" 、"(()" 都不是 有效括号字符串 。

给你一个 有效括号字符串 s,返回该字符串的 s 嵌套深度 。

示例 1:输入:s = "(1+(2*3)+((8)/4))+1"
输出:3
解释:数字 8 在嵌套的 3 层括号中。

示例 2:输入:s = "(1)+((2))+(((3)))"
输出:3


示例 3:输入:s = "1+(2*3)/(2-1)"
输出:1

示例 4:输入:s = "1"
输出:0

分析:对于括号问题,要想到栈,这里括号的深度只与‘( ’和‘ )’有关系,所以我们遍历字符串,遇到左括号就入栈,遇到右括号就出栈。这里我们只需要考虑栈的大小,同时注意所求为最大括号深度(可绘图理解)

 代码如下:

class Solution {
public:
    int maxDepth(string s) {
        int maxd,size;
        //遍历字符串
        for(char ch:s){
            //左括号就++
            if(ch=='('){
                size++;
            }
            //右括号就--
            else if(ch==')'){
                size--;
            }
            //找最大的括号深度,所以要考虑到
            //例如:"(1+(2*3)+((8)/4))+1"
            maxd=max(size,maxd);
        }
        return maxd;
    }
};

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

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。

示例 1:输入:s = "()"
输出:true

示例 2:输入:s = "()[]{}"
输出:true

示例 3:输入:s = "(]"
输出:false

示例 4:输入:s = "([)]"
输出:false

分析:对于括号问题,要想到栈。碰到左括号就入栈,碰到右括号就查看栈顶的元素是否为对应的左括号。同时当字符串为奇数个数时,肯定不有效(可绘图理解)

 代码如下:

class Solution {
public:
	stack<char>Stack;
	bool isValid(string s) {
		char ch;
        //字符串个数为奇,直接返回false
        if(s.size() & 1){
            return false;
        }
        //遍历字符串
		for (int i = 0; i < s.size(); i++) {
            //左括号入栈
			if (s[i] == '(' || s[i] == '[' || s[i] == '{') {
				Stack.push(s[i]);
			}
            //右括号
			else {
                //如果栈为空,肯定不有效
				if (Stack.empty()) {
					return false;
				}
                //栈不为空
				else {
                    //栈顶元素与当前字符是否对应
                    //对应的话,栈顶元素出栈
					ch = Stack.top();
					if (s[i] == ')' && ch == '('){
                        Stack.pop();
                    }
					else if(s[i] == ']' && ch == '['){
                        Stack.pop();
                    }
					else if(s[i] == '}' && ch == '{'){
						Stack.pop();
					}
                    //不对应,肯定无效
                    else{
                        return false;
                    }
				}
			}

		}
        //最后整个结束,栈为空说明有效
		return Stack.empty();
	}
};

总结:遇到括号问题,要想到栈。因为一个左括号必定与一个右括号对应(有效括号),符合栈的特点。左括号有的话就 push 进来,找到右括号就可以把栈顶的左括号给 pop 删除掉,很适合使用栈来解决这类问题。同时这里还有一个判断奇数的方法,值得一记

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Libert_AC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值