题目链接
https://leetcode-cn.com/problems/valid-parentheses/
1、题目要求
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true
提示:
1 <= s.length <= 104
s 仅由括号 '()[]{}' 组成
2、思路分析
括号匹配问题,可以使用栈进行解决,所以使用的双向队列,这个可以当做栈来使用,也是可以当做队列使用;
每次将左符号对应的右符号放入栈中,然后当右边符号进入的时候,就可以进行匹配,匹配成功就出栈;
所有的括号都满足匹配的时候,栈就会变成空的;
匹配失败,说明匹配的过程中发生了问题,括号匹配失败;
3、执行代码
public class Sulotion {
public static void main(String[] args) {
isValid("}[])");
}
public static boolean isValid(String s) {
Deque<Character> deque;
deque = new LinkedList<>();
char ch;
for (int i = 0; i < s.length(); i++) {
ch = s.charAt(i);
//碰到左括号,就把相应的右括号入栈
if (ch == '(') {
// 双向队列的头部添加元素
deque.push(')');
} else if (ch == '{') {
deque.push('}');
} else if (ch == '[') {
deque.push(']');
} else if (deque.isEmpty() || deque.peek() != ch) {
// 1 防止上来直接就是右括号,
// 2 防止括号交叉匹配的情况 "{( } )"
return false;
} else {//如果是右括号判断是否和栈顶元素匹配
// 双向队列的头部移除 当所有的元素移除的时候,说明全部匹配成功,结果正确
deque.pop();
}
}
//最后判断栈中元素是否匹配
return deque.isEmpty();
}
}
4、问题反思
4.1、deque.isEmpty() || deque.peek() != ch
1 防止上来直接就是右括号,
2 防止括号交叉匹配的情况 “{( } )”
4.2、上面使用的方法小结
上面使用到的方法,始终是在操作栈的头部,从头部放入元素,查看头部的元素,将栈头部的元素删除;
5、小结
通过栈这种数据结构,完成了括号的匹配问题,本质上来说,关于匹配的问题都是可以使用栈这种数据结构来解决的;