2013-11-02 50 views
0

我有一些特定的任務。我們有像「(()[] <>)」或類似的東西。我面試問題中的一個問題是如何檢查字符串是正確還是錯誤。例如:「()[] <>」 - true,「([)」 - false,「[(])」 - false,「([<>])」 - true。非常感謝你們! 我無法理解我的代碼有什麼問題。 非常感謝各位傢伙! 請幫忙!如何使用堆棧檢查字符串

import java.util.Stack;

公共類的測試{

public static void main(String[] args) { 

    String line = "(<>()[])"; 
    Test test = new Test(); 
    boolean res = test.stringChecker(line); 
    System.out.println(res); 
} 

public boolean stringChecker(String line){ 
    boolean result = false; 
    char letter = '\u0000'; 
    char[] arr = line.toCharArray(); 
    Stack<Character> stack = new Stack(); 

    for (int i = 0; i < arr.length; i++) { 
     if (arr[i] == '(' || arr[i] == '[' || arr[i] == '<') { 
      stack.push(arr[i]); 
     } 
     if(arr[i] == ')' || arr[i] == ']' || arr[i] == '>'){ 
       if(stack.peek() == arr[i]){ 
        result = true; 
        stack.pop(); 

      } 
     } 
    } 

    return result; 
} 

}

+0

非常感謝! – Sergey

回答

2

(0)你是推<(和{但在你偷看你檢查>),並}

(1 )首先結果爲false,並在第一次成功匹配時將其設置爲true。相反,您應該從結果true開始,並在第一次失敗的匹配時將其設置爲false。

(2)當字符用完時,應檢查堆棧是否爲空。

(3)您應該在查看之前檢查堆棧是否爲空。

(4)您可能想要檢查不是預期的字符。

+0

感謝您的編輯,不幸的是我是AFK,所以我無法批准它。我編輯了我的答案以顯示完整的代碼,請隨時再次改進! – A4L

0

除了@TheodoreNorvell的解釋這裏是實現可能看起來怎麼樣

public boolean stringChecker(String input) { 
    boolean result = true; 
    char[] arr = input.toCharArray(); 
    Stack<Character> stack = new Stack<>(); 
    try { 
     for (int i = 0; result && i < arr.length; i++) { 
      if (arr[i] == '(' || arr[i] == '[' || arr[i] == '<') { 
       stack.push(arr[i]); 
      } else if(arr[i] == ')') { 
       Character c = stack.pop(); 
       result = c.equals('('); 
      } else if(arr[i] == ']') { 
       Character c = stack.pop(); 
       result = c.equals('['); 
      } else if(arr[i] == '>') { 
       Character c = stack.pop(); 
       result = c.equals('<'); 
      } else { 
       // found some char that is not allowed 
       // here it is not just ignored, 
       // it invalidates the input 
       result = false; 
      } 
     } 
     // when the teher is not more chars in the array 
     // the stack has to be empty 
     result = result && stack.isEmpty() ; 
    } catch(EmptyStackException e) { 
     // found a closing bracket in the array 
     // but there is nothing on the stack 
     result = false; 
    } 
    return result; 
} 

@Test 
public void stringChecker() { 
    Assert.assertTrue(stringChecker("[]")); 
    Assert.assertTrue(stringChecker("[(<>)]")); 
    Assert.assertFalse(stringChecker("([<>)]")); 
    Assert.assertFalse(stringChecker(">")); 
    // invalid char 
    Assert.assertFalse(stringChecker("<[]e>")); 
    // stack is not empty 
    Assert.assertFalse(stringChecker("(")); 
} 

注意,在這樣的情況switch-case聲明比if-else if-else更優雅。