2016-10-21 33 views
-1

我解決下一個技術問題(Q1):http://blog.sdeskills.com/qotd-2016-oct-17-resistance-is-futile/計算器表達:如何知道,如果輸入錯誤

它幾乎做,只是一個任務正在等待批准。評估輸入是否平衡。檢查圓括號是否按順序,這是完成的,但不是評估標記。

在給定的子網絡可以沒有串聯/並聯連接 的混合,所以(500 + 200 | 300)是不允許的。

這是我當前的代碼:https://repl.it/EC3i/2關於如何評估以前的表達式爲錯誤的任何想法?

回答

1

試試這個。該代碼檢查運算符sereis和平衡括號。

static boolean isBalanced(String s) { 
    Deque<Character> operators = new LinkedList<>(); 
    operators.push('#'); 
    for (int i = 0; i < s.length(); ++i) { 
     if (operators.isEmpty()) return false; 
     char ch = s.charAt(i); 
     switch (ch) { 
     case '(': operators.push('#'); break; 
     case ')': operators.pop(); break; 
     case '+': 
      switch (operators.peek()) { 
      case '#': operators.pop(); operators.push(ch); break; 
      case '+': break; 
      default: return false; 
      } 
      break; 
     case '|': 
      switch (operators.peek()) { 
      case '#': operators.pop(); operators.push(ch); break; 
      case '|': break; 
      default: return false; 
      } 
      break; 
     } 
    } 
    return operators.size() == 1; 
} 

和JUnit測試代碼。

@Test 
public void testIsBalanced() { 
    assertTrue(isBalanced("(2)")); 
    assertTrue(isBalanced("(2+3+3)")); 
    assertTrue(isBalanced("2+3+3")); 
    assertTrue(isBalanced("2+(4|5|5)+3")); 
    assertTrue(isBalanced("2+(4|(2+3+4)|5)+3")); 
    assertTrue(isBalanced("(2)+3()")); 
    assertFalse(isBalanced("(2")); 
    assertFalse(isBalanced("(2))")); 
    assertFalse(isBalanced("((2)")); 
    assertFalse(isBalanced("2|3+3")); 
    assertFalse(isBalanced("2+(4|5+5)+3")); 
    assertFalse(isBalanced("2+3|3")); 
} 
+0

你是如何得出結論的?我的意思是,你怎麼知道每個'#'的位置? –

+0

'#'表示它在序號的開頭是一個未知的運算符,它被括在圓括號中。 – saka1029