计算机程序中有非常多的栈的应用,其中最典型的就是括号匹配,以此来更深入的了解一下栈的原理
例题:20.有效的括号
代码:
class Solution {
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
char ch;
for(int i=0;i<s.length();i++){
ch=s.charAt(i);
if(ch=='(') stack.push(')');
else if(ch=='[') stack.push(']');
else if(ch=='{') stack.push('}');
//第二种和第三种情况(括号不匹配和右括号多余的情况)
else if(stack.isEmpty() || stack.peek()!=ch) return false;
else stack.pop();
}
return stack.isEmpty();//第一种情况
}
}
总结点:
1.情况分析
本题最具有价值的地方在于对于题目的情况分析,对于本题,我们应该思考括号不匹配的情况有哪些:
(1)第一种情况,字符串里左方向的括号多余了,所以不匹配。
(2)第二种情况,括号没有多余,但是括号的类型没有匹配上。
(3)第三种情况,字符串里右方向的括号多余了,所以不匹配。
只要可以把情况分析清楚,使用if..else if...的分支逻辑首先就可以把题目的整体逻辑框架确定下来
2.括号匹配(抵消)
在进行括号匹配的时候为了方便这里我们选择遇到左括号的时候把其对应的有括号压栈,后续碰到右括号的时候比较其是否和栈顶元素相同,若相同则直接弹栈(代码更为简洁但减低了可读性)。这样的话对应这些括号的三种匹配情况有如下操作:
第一种情况:已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false
第二种情况:遍历字符串匹配的过程中,发现栈里没有要匹配的字符。所以return false
第三种情况:遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号return false