1. 程式人生 > >面試演算法:使用堆疊判斷括號的匹配

面試演算法:使用堆疊判斷括號的匹配

在寫程式碼的時候,我們往往遇到一個頭疼的問題,例如當我們使用很多if else 語句時,特別是 if else 間套地很厲害使,最容易出現的一個問題是,括號不匹配,你突然之間無法判斷當前的右括號到底跟上面的那個括號相匹配。

我們人眼看不出來,但編譯器缺失明察秋毫,只要你括號不匹配,那麼你就不可能編譯的過,這節我們看看,編譯器是如何快速的查詢到括號不匹配的。

給定一個括號字串:“()()((())(())”,給定一個演算法,判斷給定的字串中括號是否匹配。

選擇合適的資料結構就能解決演算法問題的三分之二,如果我們使用堆疊解決這個問題,那麼問題的難度就大大降低了。

我們的演算法設計如下:

1, 變數字串中的每一個字元。

2, 如果掃描到的字元是左括號’(‘, 則把該字元壓入堆疊

3, 如果掃描到的是右括號,‘)’,那麼如果此時堆疊為空,表示括號字串不匹配

4, 如果掃描到的是右括號,並且堆疊不為空,那麼彈出堆疊頂部的字元。

5, 當每個括號字元都掃描完畢後,堆疊不為空,那麼字串中的括號不匹配,如果堆疊為空,那麼字串中的括號就匹配。

根據上面的演算法步驟,我們可以實現以下編碼:

import java.util.Stack;


public class ParentMatcher {
    private Stack<Character> stack = new
Stack<Character>(); private String parentStr = ""; public ParentMatcher(String parents) { this.parentStr = parents; } public boolean isMatch() throws Exception{ for (int i = 0; i < parentStr.length(); i++) { if (parentStr.charAt(i) == '(') { stack.push(parentStr.charAt(i)); } else
if (parentStr.charAt(i) == ')') { if (stack.size() == 0 || stack.pop() != '(') { return false; } } else { throw new Exception("Illegal character"); } } if (stack.size() != 0) { return false; } return true; } }

在主入口函式,我們給上面的類輸入一個括號字串,然後看看執行結果:

public class StackAndQuque {
    public static void main(String[] args) {
        ParentMatcher matcher = new ParentMatcher("((())(())");
        try {
            System.out.println("The matching result is : " + matcher.isMatch());
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

由於我們例子中給定的括號字串是匹配的,因此isMatch()返回結果為true.

我們的演算法只需要遍歷字串中的每個字元,因此時間複雜度是O(N), 同時演算法並沒有申請任何多餘記憶體,因此空間複雜度是O(1).

更多技術資訊,包括作業系統,編譯器,面試演算法,機器學習,人工智慧,請關照我的公眾號:
這裡寫圖片描述