棧的典型用法之一:括號匹配
解題思路
棧是一種“先進后出”的數據結構。
本例中,棧頂元素反映了在嵌套的層次關系中,最近的需要匹配的元素。
所以我的解決方案使用棧,碰到任意左括號時入棧,否則取出棧頂元素,判斷當前字符是否與棧頂元素匹配,不匹配則停止循環並返回假,否則全部循環完之后判斷棧是否為空(不為空可能存在在最前面只有左括號的情況),是空則返回真,否則返回假。
代碼
class Solution {
public boolean isValid(String s) {
Stack<Character> stack = new Stack<Character>();
// 依次遍歷字符串中的字符
for (int i = 0; i < s.length(); i++) {
char tag = s.charAt(i);
if (tag == '(' || tag == '[' || tag == '{') {
// 判斷是為左括號則入棧
stack.push(tag);
} else {
// 否則看是否匹配
// 棧為空說明沒有左括號就來了右括號,不符合規則,失敗
if(stack.isEmpty()){
return false;
}
// 取出棧頂元素,上面判斷了不為空,所以沒異常
char top = stack.pop();
// 判斷棧頂元素是否與目標元素是匹配的,不匹配可以直接返回假了
if (top == '(' && tag!=')'){
return false;
}else if (top == '[' && tag!=']'){
return false;
}else if (top == '{' && tag!='}'){
return false;
}
}
}
// 最后判斷是否還有多的沒有匹配的,可以直接返回結果
return stack.isEmpty();
}
}