代码之家  ›  专栏  ›  技术社区  ›  Oscar

计算器表达式:如何知道输入是否错误

  •  -1
  • Oscar  · 技术社区  · 8 年前

    我正在解决下一个技术问题(Q1): http://blog.sdeskills.com/qotd-2016-oct-17-resistance-is-futile/

    在给定的子网络中,不能混合使用串联/并联 连接,因此(500+200|300)是不允许的。

    这是我当前的代码: https://repl.it/EC3i/2 你知道如何将前面的表达式计算为错误的吗?

    1 回复  |  直到 8 年前
        1
  •  1
  •   user4910279 user4910279    8 年前

    试试这个。此代码检查运算符序列和平衡圆括号。

    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"));
    }