一個月前,和小夥伴每週來一道算法題,一直沒有總結,今天看數據結構中的棧和隊列,看到了一個非常有意思的總結,什麼是棧,什麼是隊列呢?一個經典的評論且有味的總結是這麼說的,“喫飯喫多了想吐,就是棧。喫飯喫多了想拉,就是隊列。” 笑死啦。 棧這種受限的線性結構,有什麼神奇之處呢?
如果給你一段字符串 “{ [ ( ) ] }”,給你三種括號,且這三種括號任意嵌套,如何檢查這段字符串是否合法。比如“{ [ ] ( )[ { } ] }” 或“[ { ( ) } ( [ ] ) ]”等都爲合法格式,而“{ [ }( )]”或”[ ( { ) ]”爲不合法的格式。通過什麼樣的方式檢查它呢?
其實棧這種數據結構可以解決該類問題,我們用棧來保存未匹配的左括號,從左到右依次掃描字符串。當掃描到左括號時,則將其壓入棧中;當掃描到右括號時,從棧頂取出一個左括號。如果能夠匹配,比如“(”跟“)”匹配,“[”跟“]”匹配,“{”跟“}”匹配,則繼續掃描剩下的字符串。如果掃描的過程中,遇到不能配對的右括號,或者棧中沒有數據,則說明爲非法格式。當所有的括號都掃描完成之後,如果棧爲空,則說明字符串爲合法格式;否則,說明有未匹配的左括號,爲非法格式。
package com.fjx.stringcheck;
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
public class ValidCheck {
public static void main(String[] args) {
// 定義字符串的內容
String symbol="[(]){}";
// 調用判斷方法
boolean result=isValid(symbol);
System.out.print(result);
}
public static boolean isValid(String s){
// 定義一個空棧
Stack<Character> stack=new Stack<>();
// 定義 map ,用來存放匹配的符號
Map<Character,Character> map=new HashMap<>();
// 將字符串存入數組arr中
char[] arr=s.toCharArray();
// 通過鍵值對的方式存儲數據
map.put(')','(');
map.put(']','[');
map.put('}','{');
for (int i=0;i<arr.length;i++){
// 如果 map 的鍵中不包含右邊括號,也就是做左括號直接進棧
if (!map.containsKey(arr[i])){
stack.push(arr[i]);
}else {
// 棧頂彈出左括號,如果與右括號不匹配,則不合法,直接返回false
if (map.get(arr[i])!=stack.pop()){
return false;
}
}
}
// 判斷棧是否爲空,爲空,說明所有符號都已匹配完畢,全都合法,否則不合法
if (stack.empty()){
return true;
}else {
return false;
}
}
}
棧,你 GET 到了麼?