Выражение оценщика: как узнать, неверен ли ввод
Я решаю следующий технический вопрос (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"));
}