面試演算法:使用堆疊判斷括號的匹配
阿新 • • 發佈:2018-12-26
在寫程式碼的時候,我們往往遇到一個頭疼的問題,例如當我們使用很多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).
更多技術資訊,包括作業系統,編譯器,面試演算法,機器學習,人工智慧,請關照我的公眾號: