2016-11-13 38 views
0

我目前正試圖想出一個代碼,該代碼將掃描字符串 並檢查每行上是否有偶數個打開和關閉括號。如果是這樣,它會返回true。 (請原諒我在格式化不正確,但我不能讓例子正確初具規模,除非我確定它的代碼)試圖獲取代碼來檢查是否有括號

{} // The code would return true  
{{}} 
{}{} 
{{{}{{}}}} 


}  // The code would return false 
{} 
}}{ 
{{{}{} 

我試了一下,到目前爲止:

public boolean bracketsMatch(String brackets) 
{ 
    int lb = 0; 
    int rb = 0; 
    int i = 0; 
    while (brackets.charAt(i) == '{' || brackets.charAt(i) == '}' || brackets.charAt(i) == '') 
    { 
     if (brackets.charAt(i) == '{') 
     { 
     lb += 1; 
     } 

     if (brackets.charAt(i) == '}') 
     { 
      rb += 1; 
     } 

     if (brackets.charAt(i) == '') 
     { 
      if (lb/rb == 2) 
      { 
       // Is it possible to get the code scan the next line to next line? 
       // need an extra statement here for ^^ before I can place the if statement below 
      if (bracket.charAt(i + 1) == '') 
      { 
       return true; 
      } 
      } 

      else 
      { 
       return false; 
      } 
     } 
     i++ 

    } 
} 

我提前道歉對於任何有經驗的程序員來說,這將是一場無效的噩夢。一般來說,我對編程相對來說比較陌生。我試圖讓代碼檢查左括號(lb)和右括號(rb)的數量。只要代碼到達空字符串,它就會將lb除以rb。如果代碼不等於2,代碼將返回false。我在這段代碼中可能有十多個錯誤,但我想知道是否有任何方法讓代碼進入下一行來掃描下一組括號。感謝您提前提供任何幫助。

編輯1:

public boolean bracketsMatch(String brackets) 
{ 
    int balance = 0; 
    for (int i = 0; i < brackets.length(); i++) 
    { 
     char value = brackets.charAt(i); 
     if (value == '{') 
     { 
     balance += 1; 
     } 

     else if (value == '}') 
     { 
      balance -= 1; 
     } 

    } 

    if (balance != 0) 
    { 
     return false; 
    } 

    else 
    { 
     return true; 
    } 
} 
+0

第一個示例返回true,因爲每行上都有偶數個括號。第二個可能有一個{},但大多數行的開放和閉合括號數量不等。 –

+0

要驗證括號是否平衡,您需要'lb == rb',而不是'lb/rb == 2'。而且這個代碼不會編譯,因爲''''不是一個有效的字符文字。 –

+1

在正常的括號內使用時,'{'必須在'}之前嗎?換句話說,這條線應該是什麼結果:'} {'?此外,你的行只包含括號,或者可以是,例如,「{ok}」? –

回答

3

這將無法編譯,因爲''是無效字符文字:

if (brackets.charAt(i + 1) == '') 

和當前計數打開和關閉支架的方法, 並檢查lb/rb的值將不會產生正確的結果。

您不需要計算正確的括號。您只需計算開放的括號,並在關閉時減少計數。

下面是一個算法的草圖就可以使用, 我希望不會破壞運動:

  1. 對於字符串中的每個字符
  2. 如果它是一個開放的支架,增加計數
  3. 如果它是一個閉括號
    • 如果打開次數爲0,沒有什麼可以關閉,所以他們不均衡,我們可以停止
    • 遞減計數
  4. 所有字符後,如果打開次數是0,括號內是平衡

作爲一個額外的代碼審查注意到,這是壞在許多方面:

if (brackets.charAt(i) == '{') { 
    // ... 
    } 

    if (brackets.charAt(i) == '}') { 
    // ... 
    } 

什麼是壞:

  • 如果結果始終相同,則不必重複撥打brackets.charAt(i)即可。調用一次並將結果保存在變量中。
  • 這兩個if條件是排他性的:如果第一個條件成立,第二個條件不成立,所以評估它是毫無意義的。第二個條件應該是if else而不是if。而不是一個if-else鏈,switch在這裏可能更有趣。
  • 而不是調用字符串brackets,最好把它稱爲更一般的東西。如果實際輸入是「{something}」呢?然後它包含的不僅僅是括號,但算法的工作原理也是一樣的。稱它爲括號是誤導。
+1

Upvoted爲一個很好的算法草圖的目的(不,我不認爲你太多了)。 –

+0

這很好,因爲你沒有多個計數器,或者保存不必要的值,如果沒有辦法解決這個問題,也可以打破。我添加了一個工作流程,使您的答案更加完善。乾杯。 – Thrasher

+0

感謝@Thrasher的嘗試,像這樣的圖表可以真正迎合這個答案。不幸的是,你提出的圖表與我所描述的步驟不相符,在幾個點上是不正確的,所以我不得不拒絕它。 – janos

1

替代的方式做

您可以使用Java Stack類[因爲它代表對象的名單入先出的棧]。您可以使用Stack類的push和pop方法。這是實施。

public class BracketMatching { 

    public static boolean bracketMatch(String input){ 

     Stack<Character> st = new Stack<>(); 

     for(char c : input.toCharArray()){ 

      if(c == '{') 
       st.push(c); 

      else if(c == '}'){ 

       if(st.isEmpty()) 
        return false; 

       st.pop(); 
      } 
     } 

     if(st.isEmpty()) 
     return true; 

     return false; 

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

     String input1 = "{}{{}}{}{}{{{}{{}}}}"; 
     String input2 = "}{}}}{{{{}{}"; 

     System.out.println(bracketMatch(input1)); 
     System.out.println(bracketMatch(input2)); 

    } 
} 
+0

但是爲什麼在你不需要的時候使用堆棧呢?爲什麼商店價值你並不需要? (如果你使用'st.push('x')'而不是'st.push(c)',程序仍然可以工作,因爲這個值甚至不重要。因此,我的反對意見是:爲什麼要麻煩存儲它) – janos

+0

它只是一個替代解決方案。我正在考慮像「{{}}」這樣的情況,他們之間可能會有任何額外的字符,如空格和換行符。 – Someone

+0

額外的角色如何產生影響? (他們沒有) – janos