最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java 括號(hào)匹配問題案例詳解

 更新時(shí)間:2021年08月23日 08:30:16   作者:mgsky1  
這篇文章主要介紹了Java 括號(hào)匹配問題案例詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下

前言

括號(hào)匹配問題算是棧應(yīng)用中比較經(jīng)典的問題了,在數(shù)據(jù)結(jié)構(gòu)的書中還有各種考試中會(huì)出現(xiàn)。最近刷題的時(shí)候也遇到了,就想寫一篇文章整理一下。

例題

題目來自Leetcode中國(guó)
給定一個(gè)只包括 (,),{,},[,] 的字符串,判斷字符串是否有效。
有效字符串需滿足:
1、左括號(hào)必須用相同類型的右括號(hào)閉合。
2、左括號(hào)必須以正確的順序閉合。
注意空字符串可被認(rèn)為是有效字符串。
示例 1:

輸入: “()”
輸出: true

示例 2:

輸入: “()[]{}”
輸出: true

示例 3:

輸入: “(]”
輸出: false

示例 4:

輸入: “([)]”
輸出: false

示例 5:

輸入: “{[]}”
輸出: true

算法思想

S1:遍歷輸入的括號(hào)序列,如果是左括號(hào),進(jìn)入S2,如果是右括號(hào),進(jìn)入S3
S2:如果當(dāng)前遍歷到左括號(hào),則入棧
S3:如果當(dāng)前遍歷到右括號(hào),則出棧一個(gè)元素,看其是否與當(dāng)前的右括號(hào)組成一對(duì),如果不是,則匹配失敗?;蛘咴诔鰲_^程中發(fā)生異常(從空棧中出棧),也匹配失敗
S4:若能順利遍歷完成,檢查棧中是否還有剩余元素,如果有,則匹配失?。蝗绻麤]有,則匹配成功。

算法舉例

下面以(({[]}) 序列為例說明算法過程:
1、首先將這個(gè)字符串轉(zhuǎn)換成字符數(shù)組,并初始化一個(gè)空棧。

2、遍歷到第0個(gè)元素,(,為左括號(hào),入棧

3、后面以此類推,遍歷完第3個(gè)元素[后,??臻g應(yīng)該是這樣的

4、遍歷到第4個(gè)元素]時(shí),發(fā)現(xiàn)為右括號(hào),此時(shí),從棧頂出棧一個(gè)左括號(hào),即[,剛好[與],匹配成一對(duì)

5、以此類推,直到第6個(gè)元素),都是匹配的

6、此時(shí),序列已經(jīng)遍歷完畢,但是棧不是空的,所以原序列匹配失敗。

代碼

棧類

這里我使用了鏈棧,鏈表就沒有自己寫了,用了Java現(xiàn)成的LinkedList<T>

/**
 * 棧類,這里使用鏈棧
 */
class MyStack{
    private int num;
    private LinkedList<Character> data;

    public MyStack(){
        this.num = 0;
        data = new LinkedList<Character>();
    }

    /**
     * 判斷棧是否為空
     * @return
     */
    public boolean isEmpty(){
        return num == 0 ? true : false;
    }

    /**
     * 入棧
     * @param ch
     */
    public void push(Character ch){
        this.data.add(ch);
        this.num++;
    }

    /**
     * 出棧
     * @return
     */
    public Character pop(){
    	 //棧為空時(shí),返回' '
        if(this.isEmpty()){
            return ' ';
        }
        Character ch = this.data.remove(data.size()-1);
        this.num--;
        return ch;
    }
}

括號(hào)匹配核心算法

    /**
     * 核心方法
     * @param s
     * @return
     */
    public boolean isValid(String s) {
        char[] temp = s.toCharArray();
        MyStack stack = new MyStack();
        boolean flag = true;
        for(int i = 0 ; i < temp.length ; i++){
            //左括號(hào),入棧
            if(temp[i] == '(' || temp[i] == '{' || temp[i] == '['){
                stack.push(temp[i]);
            }
            else{
                //右括號(hào),出棧
                char left = stack.pop();
                //如果從棧中取出空值,說明棧已空,但還有右括號(hào)存在,肯定不匹配
                if(left == ' ') {
                    flag = false;
                }
                //如果左右括號(hào)不匹配,則失敗
                if(!check(left,temp[i])){
                    flag = false;
                }
            }
        }
        //循環(huán)完畢后,若棧不空,說明左括號(hào)個(gè)數(shù)大于右括號(hào),不匹配
        if(flag){
            if(!stack.isEmpty()){
                flag = false;
            }
        }
        return flag;
    }
}

完整代碼

import java.util.LinkedList;

/**
 * 括號(hào)匹配問題(Blog)
 */

/**
 * 棧類,這里使用鏈棧
 */
class MyStack{
    private int num;
    private LinkedList<Character> data;

    public MyStack(){
        this.num = 0;
        data = new LinkedList<Character>();
    }

    /**
     * 判斷棧是否為空
     * @return
     */
    public boolean isEmpty(){
        return num == 0 ? true : false;
    }

    /**
     * 入棧
     * @param ch
     */
    public void push(Character ch){
        this.data.add(ch);
        this.num++;
    }

    /**
     * 出棧
     * @return
     */
    public Character pop(){
        //棧為空時(shí),返回' '
        if(this.isEmpty()){
            return ' ';
        }
        Character ch = this.data.remove(data.size()-1);
        this.num--;
        return ch;
    }
}

class Solution {

    /**
     * 判定左右括號(hào)是否匹配
     * @param left
     * @param right
     * @return
     */
    private boolean check(char left , char right){
        if(left == '('){
            return right == ')' ? true : false;
        }

        if(left == '['){
            return right == ']' ? true : false;
        }

        if(left == '{'){
            return right == '}' ? true : false;
        }
        return false;
    }

    /**
     * 核心方法
     * @param s
     * @return
     */
    public boolean isValid(String s) {
        char[] temp = s.toCharArray();
        MyStack stack = new MyStack();
        boolean flag = true;
        for(int i = 0 ; i < temp.length ; i++){
            //左括號(hào),入棧
            if(temp[i] == '(' || temp[i] == '{' || temp[i] == '['){
                stack.push(temp[i]);
            }
            else{
                //右括號(hào),出棧
                char left = stack.pop();
                //如果從棧中取出空值,說明棧已空,但還有右括號(hào)存在,肯定不匹配
                if(left == ' ') {
                    flag = false;
                }
                //如果左右括號(hào)不匹配,則失敗
                if(!check(left,temp[i])){
                    flag = false;
                }
            }
        }
        //循環(huán)完畢后,若棧不空,說明左括號(hào)個(gè)數(shù)大于右括號(hào),不匹配
        if(flag){
            if(!stack.isEmpty()){
                flag = false;
            }
        }
        return flag;
    }
}

public class Main {

    public static void main(String[] args) {
	// write your code here
        Solution solution = new Solution();
        System.out.println(solution.isValid("(({[]})"));
    }
}

運(yùn)行結(jié)果

(({[]})的運(yùn)行結(jié)果

false
Process finished with exit code 0

與我們之前預(yù)測(cè)的一致。

到此這篇關(guān)于Java 括號(hào)匹配問題案例詳解的文章就介紹到這了,更多相關(guān)Java 括號(hào)匹配問題內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

民丰县| 东港市| 偏关县| 康定县| 塘沽区| 喀喇沁旗| 湖北省| 绥江县| 来凤县| 龙陵县| 南江县| 百色市| 陇川县| 铜梁县| 六安市| 武乡县| 高雄市| 盐津县| 苍南县| 丰宁| 平定县| 原平市| 巴南区| 临海市| 梁河县| 潞城市| 布拖县| 龙胜| 芦溪县| 南开区| 遂昌县| 姚安县| 民和| 平湖市| 恩平市| 肇源县| 沂水县| 墨竹工卡县| 舒兰市| 团风县| 莒南县|