括号序列

题目:
给出一个仅包含字符’(‘,’)’,’{‘,’}’,’[ ‘和 ‘]’,的字符串,判断给出的字符串是否是合法的括号序列括号必须以正确的顺序关闭,”()”和”()[]{}”都是合法的括号序列,但”(]”和”([)]”不合法。

示例:
给出字符串 “[“,返回false
给出字符串 “[]”,返回true
给出字符串”[}”,返回false

思路:
① 将字符串转换为字符数组。
② 使用栈,遍历数组,让数组的元素入栈。判断出栈的元素是否和下次要进栈的元素配对,若配对,则出栈,若不配对,则不出栈。将该字符放入栈中。如果字符串中的括号都是配对的,最后栈一定是空的。
③ 使用for循环遍历数组。
图解如下:
字符串 - 图1
for循环遍历数组,此时i = 0,指向数组第一个元素,此时栈为空,则将 [ 入栈,
字符串 - 图2
此时 i=1,比较array[i] == ‘]’ && stack.peek() == ‘[‘; 或者判断 array[i] = ‘}’ && stack.peek() == ‘{‘ 或者判断array[i] == ‘)’ && stack.peek() == ‘(‘ ,如果满足条件,则说明 栈顶括号和此时i=1位置上的括号是配对的。让栈顶元素出栈。

最后的结果就是:
字符串 - 图3
代码实现:

  1. public boolean isValid (String s) {
  2. char[] data = s.toCharArray();
  3. Stack<Character> stack = new Stack<>();
  4. for(int i = 0; i<data.length;i++){
  5. if(stack.empty()){
  6. stack.push(data[i]);
  7. continue;
  8. }
  9. if(data[i]==')' && stack.peek() == '('){
  10. stack.pop();
  11. }else if(data[i]=='}' && stack.peek()=='{'){
  12. stack.pop();
  13. }else if(data[i]==']' && stack.peek()=='['){
  14. stack.pop();
  15. }else{
  16. stack.push(data[i]);
  17. }
  18. }
  19. return stack.empty();
  20. }