2016-10-21 71 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