2017-10-16 56 views
-1

對於我的CS類,我必須創建一個布爾函數isBalanced(String x),它接受一個字符串並計算括號/圓括號的數量,並且如果括號匹配它的對,則返回true (例如,{是一對},(是一對),[是一對]等)。如果括號正確匹配,該函數將返回true,否則返回false。爲了澄清,如果您想知道該對象是什麼,MyStack()是我自己的Java堆棧接口的實現。的代碼如何工作,並返回Java Stacks /找不到邏輯錯誤

實例:

{A(B [C])} d將返回真。

{A(B [C)] D}將返回false。

我的代碼中的問題是一個邏輯錯誤。出於某種原因,如果缺少支架,我的函數返回true,該支架應該返回false。

{A(B)C將返回false,但我的代碼讀取它爲true。你有任何解決方案可以幫助我的代碼正常工作嗎?謝謝!

Balancer.java

public static boolean isBalanced(String x) { 
    MyStack<String> stack = new MyStack(); 

if (x.substring(0,1).equals("}") || x.substring(0,1).equals(")") || x.substring(0,1).equals("]")) { 
    return false; 
} 
for (int i=0; i<x.length(); i++) { 
    if (x.substring(i,i+1).equals("{") || x.substring(i,i+1).equals("(") || x.substring(i,i+1).equals("[")) { 
     stack.add(x.substring(i,i+1)); 
    } 
    if (x.substring(i,i+1).equals("}") || x.substring(i,i+1).equals(")") || x.substring(i,i+1).equals("]")) { 
     if (x.substring(i,i+1).equals("}") && stack.peek().equals("{")) { 
      stack.pop(); 
     } else if (x.substring(i,i+1).equals(")") && stack.peek().equals("(")) { 
      stack.pop(); 
     } else if (x.substring(i,i+1).equals("]") && stack.peek().equals("[")) { 
      stack.pop(); 
     } else { 
      return false; 
     } 
    } 
} 
return true; 
} 

這個文件,標記Main.java,僅僅是一個測試。我忽略了代碼工作的其他情況。該函數返回false的原因是有一個缺失}應該在最後,但沒有,但我的函數由於某種原因返回true。

Main.java

public static void main(String[] args) { 
    ... 

    String test4 = "{AA[B(CDE{FG()T})V]"; 
    System.out.println("Missing final close (empty stack case)"); 
    System.out.println("Should be false, is: " + Balancer.isBalanced(test4)); // does not work   
} 
+1

我已經低估了這個問題,因爲沒有任何有關此代碼執行調試的證據。請[編輯]您的問題,向我們展示您的調試未發現的內容,以及關於特定代碼行的具體問題。請參閱:[如何創建最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)和[如何調試小程序](https://ericlippert.com/2014/03/05 /如何調試的小程序/)。 –

+2

'return stack.isEmpty();'我會期待 - 甚至沒有閱讀代碼。因爲所有開放的括號必須在最後關閉。 –

回答

0

你有一個系列,如果匹配的一對支架的被發現,只有彈出堆棧的條件。我認爲你過於複雜 - 如果找到了一個左括號,把它推到堆棧。如果找到右括號,請彈出堆棧並確保它們匹配。例如:

private static final Map<Character, Character> CLODSE_TO_OPEN = new HashMap<>(); 
static { 
    CLODSE_TO_OPEN.put(')', '('); 
    CLODSE_TO_OPEN.put(']', '['); 
    CLODSE_TO_OPEN.put('}', '{'); 
} 

public static boolean isBalanced(String x) { 
    Stack<Character> stack = new Stack<>(); 

    for (int i = 0; i < x.length(); ++i) { 
     char c = x.charAt(i); 
     if (CLODSE_TO_OPEN.containsValue(c)) { 
      stack.push(c); 
     } else if (CLODSE_TO_OPEN.containsKey(c)) { 
      try { 
       if (!CLODSE_TO_OPEN.get(c).equals(stack.pop())) { 
        return false; 
       } 
      } catch (EmptyStackException e) { 
       return false; 
      } 
     } 
    } 

    return stack.isEmpty(); 
} 
+0

爲什麼不使用'Stack#empty()'而不是用try-catch包裝'Stack#pop()'調用? – Obicere

+0

@Obicere只是一種文體偏好。你可以明確地檢查'empty()'。 – Mureinik