Когда вы видите &
, а вершина стека - &
, затем вытолкните его, в противном случае нажмите &
.
, чтобы ваш код справился с этим, не обрабатывая &
специально, просто поменяйте код, чтобы проверить stack
перед map
.
Другие проблемы с вашим кодом:
* 1016Класс * - это устаревший класс, построенный поверх синхронизированного класса Vector
.Как сказано в javadoc, вместо этого вы должны использовать Deque
.
Не сверните слишком много своих утверждений.Поместите оператор, контролируемый if
, в отдельной строке, чтобы улучшить читаемость человеком.
Не используйте ==
(или !=
) для сравнения объектов, используйте equals()
.
Вы забыли проверить, пуст ли стек после цикла, чтобы убедиться, что нет висячих пар.
public static boolean isBalanced(String input) {
if (input == null)
return false;
int size = input.length();
if (size % 2 == 1)
return false;
HashMap<Character, Character> map = new HashMap<>();
map.put('(', ')');
map.put('[', ']');
map.put('{', '}');
map.put('&', '&');
Deque<Character> stack = new ArrayDeque<>();
for (int i = 0; i < size; i++) {
Character temp = input.charAt(i); // autobox here so it only happens once
if (temp.equals(stack.peek())) // equals is false if stack is empty, since peek returns null
stack.pop();
else if (map.containsKey(temp))
stack.push(map.get(temp));
else
return false;
}
return stack.isEmpty();
}
Тест
System.out.println(isBalanced("{([])}"));
System.out.println(isBalanced("{(})"));
System.out.println(isBalanced("&{&&}&"));
System.out.println(isBalanced("&{&}"));
System.out.println(isBalanced("(("));
Выход
true
false
true
false
false