【數據結構與算法】06. java判斷字符串是否合法(棧)

一個月前,和小夥伴每週來一道算法題,一直沒有總結,今天看數據結構中的棧和隊列,看到了一個非常有意思的總結,什麼是棧,什麼是隊列呢?一個經典的評論且有味的總結是這麼說的,“喫飯喫多了想吐,就是棧。喫飯喫多了想拉,就是隊列。” 笑死啦。 棧這種受限的線性結構,有什麼神奇之處呢?

如果給你一段字符串 “{ [ ( ) ] }”,給你三種括號,且這三種括號任意嵌套,如何檢查這段字符串是否合法。比如“{ [ ] ( )[ { } ] }” 或“[ { ( ) } ( [ ] ) ]”等都爲合法格式,而“{ [ }( )]”或”[ ( { ) ]”爲不合法的格式。通過什麼樣的方式檢查它呢?

其實棧這種數據結構可以解決該類問題,我們用棧來保存未匹配的左括號,從左到右依次掃描字符串。當掃描到左括號時,則將其壓入棧中;當掃描到右括號時,從棧頂取出一個左括號。如果能夠匹配,比如“(”跟“)”匹配,“[”跟“]”匹配,“{”跟“}”匹配,則繼續掃描剩下的字符串。如果掃描的過程中,遇到不能配對的右括號,或者棧中沒有數據,則說明爲非法格式。當所有的括號都掃描完成之後,如果棧爲空,則說明字符串爲合法格式;否則,說明有未匹配的左括號,爲非法格式。

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 到了麼?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章