Выражение оценщика: как узнать, неверен ли ввод

Я решаю следующий технический вопрос (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"));
}
Другие вопросы по тегам