1. 程式人生 > >資料結構——使用Java棧實現【括號匹配】

資料結構——使用Java棧實現【括號匹配】

給定一個只包括 '('')''{''}''['']'的字串,判斷字串是否有效。

有效字串需滿足:

  1. 左括號必須用相同型別的右括號閉合。
  2. 左括號必須以正確的順序閉合。

注意空字串可被認為是有效字串。

參考leetcode.com或leetcode-cn.com   第20題  有效的括號

實現思路:

{  [  (  )  ]  }

1、依次遍歷字串,只要是{  [  (  都把它壓入棧中

2、如果是  )   ]    }    則先後判斷棧頂元素是否為(  ,如果是則匹配成功,棧頂中  (  出棧,不是則返回false,不匹配

3、判斷棧頂元素是否為 ] ,如果是則匹配成功,棧頂中  [  出棧

4、判斷棧頂元素是否為 } ,如果是則匹配成功,棧頂中  {  出棧

5、判斷棧中是否還存在元素,如果不存在則表示之前已經全部匹配出棧,如果還存在則表示部分未匹配,判斷依據,stack.isEmpty()。

即 棧頂元素反映了在巢狀的層次關係中,最近的需要匹配的元素。

具體程式碼實現:

package cn.itcats.stack;

import java.util.Stack;

public class Solution {
    public boolean isValid(String s) {
        //1、申明一個stack
        Stack<Character> stack = new Stack<Character>();
        //遍歷s String本質上是char[]
        for(int i = 0 ; i < s.length() ; i++){
            char c = s.charAt(i);
            if(c == '{' || c == '[' || c=='('){
                //如果是{ [ (   壓入棧中
                stack.push(c);
            }else{
                //  }  ]  )   進行比對
                if(stack.isEmpty()){
                    return false;
                }
                char topChar = stack.pop();
                if(c == ']' && topChar != '['){
                    return false;
                }
                if(c == '}' && topChar != '{'){
                    return false;
                }
                if(c == ')' && topChar != '('){
                    return false;
                }
            }
        }
        //如果迴圈結束,棧中沒有元素則表示全部匹配成功
        return stack.isEmpty();
    }
}