簡體   English   中英

有人可以向我解釋這段代碼最后一部分的邏輯嗎?

[英]Can someone explain to me the logic of the last part of this code?

我在做hackerrank,我試圖理解RodneyShag寫的解決方案。 (信用:他寫了解決方案,而不是我)我試圖理解最后一部分。

import java.util.Scanner;
import java.util.HashMap;
import java.util.ArrayDeque;

class Solution {
    public static void main(String[] args) {
        /* Create HashMap to match opening brackets with closing brackets */
        HashMap<Character, Character> map = new HashMap<>();
        map.put('(', ')');
        map.put('[', ']');
        map.put('{', '}');

        /* Test each expression for validity */
        Scanner scan = new Scanner(System.in);
        while (scan.hasNext()) {
            String expression = scan.next();
            System.out.println(isBalanced(expression, map) ? "true" : "false" );
        }
        scan.close();
    }

    private static boolean isBalanced(String expression, HashMap<Character, Character> map) {
        if ((expression.length() % 2) != 0) {
            return false; // odd length Strings are not balanced
        }        
        ArrayDeque<Character> deque = new ArrayDeque<>(); // use deque as a stack
        for (int i = 0; i < expression.length(); i++) {
            Character ch = expression.charAt(i);
            if (map.containsKey(ch)) {
                deque.push(ch);
            } else if (deque.isEmpty() || ch != map.get(deque.pop())) {
                return false;
            }
        }
        return deque.isEmpty();
    }
}

解釋(由他提供)是

我們的 map 只有 3 個鍵: (, [, { linemap.containsKey(ch) 檢查它是否是上述鍵之一,如果是,則將其推送到雙端隊列。

deque.isEmpty() || ch.= map.get(deque.pop())

檢查我們是否有一個有效的表達式。 由於此時,我們知道字符不是 (、[ 或 {,所以我們必須有一個有效的右大括號。如果

1)我們的雙端隊列是空的,我們只是讀取了一個右大括號,然后我們有一個無效的表達式(並返回 false)

2)如果右大括號與我們從雙端隊列中彈出的左大括號不匹配,那么我們有一個無效的表達式(並返回 false)

我知道Character ch = expression.charAt(i); 應該是:檢查表達式中的每個變量是否 = 到 map 字符中的變量。

為什么只有([{在 map 中?map 中沒有( ) [ ] { }嗎?

map 用於指定在給定左括號的情況下哪個字符是右括號。 所以當你寫

map.get('(')

你得到的字符)定義為

map.put('(', ')');

在初始化。

ch.= map.get(deque.pop())行檢查的是字符ch是否是基於堆棧頂部值的預期右括號。 為了使其更清晰/更詳細, else if()部分可以重寫為:

if (map.containsKey(ch)) {
    deque.push(ch);
} else {
    // 'ch' must be one of ), ] or } (or something completely different) at this point

    if (deque.isEmpty()) {
        // stack is empty, but shouldn't, so return false
        return false;
    }

    Character lastOpeningBracket = deque.pop(); // is one of (, [ or {
    Character expectedClosingBracket = map.get(lastOpeningBracket); // is one of ), ] or }
    Character actualReadCharacter = ch; // only for verbosity
    if (!expectedClosingBracket.equals(actualReadCharacter)) {
        System.out.println("The character "+actualReadCharacter+" was read from\n"+
                           "the string, but it should be\n"+
                           "a "+expectedClosingBracket+" character\n"+
                           "because the last opening bracket was\n"+
                           "a "+lastOpeningBracket); // only for verbosity
        return false;
    }
}

(注意比較charCharacter ,請參閱@matt 的評論以及Java 中 == 和 equals() 之間的區別是什么?同時檢查可能在此處使用的Character緩存

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM