Дополнительно
Скобки/скобки, используя соответствующий алгоритм стека
Например, если скобки/скобки соответствует по следующим:
({})
(()){}()
()
и так далее, но если скобки/скобки не совпадающие она должна возвращать false, например:
{}
({}(
){})
(()
и так далее. Можете ли вы проверить этот код? Спасибо заранее.
в
public static boolean isParenthesisMatch(String str) {
Stack<Character> stack = new Stack<Character>();
char c;
for(int i=0; i < str.length(); i++) {
c = str.charAt(i);
if(c == '{')
return false;
if(c == '(')
stack.push(c);
if(c == '{') {
stack.push(c);
if(c == '}')
if(stack.empty())
return false;
else if(stack.peek() == '{')
stack.pop();
}
else if(c == ')')
if(stack.empty())
return false;
else if(stack.peek() == '(')
stack.pop();
else
return false;
}
return stack.empty();
}
public static void main(String[] args) {
String str = "({})";
System.out.println(Weekly12.parenthesisOtherMatching(str));
}
29
27
Ваш код имеет некоторую сумятицу в ее обработки '{' и '}' символы. Оно должно быть совершенно параллельно, как вы справляетесь с '(' и ')'.
Этот код, немного измененный от вашего, кажется, чтобы работать должным образом:
Этот код проще для понимания:
Алгоритм:
Теперь, скобки сбалансированы для двух условий:
На самом деле, нет необходимости для проверки любых случаях"на глаз" вручную&;. Вы можете просто выполнить следующий алгоритм:
Перебора заданной последовательности. Начните с пустого стека.
Если текущий символ является открывающей скобкой, просто толкать его в стек.
Если это'с закрывающей скобкой, проверить, что стек не пуст и верхний элемент шаг является соответствующая открывающая скобка(то есть, совпадает с вашей). Если это не так, сообщить об ошибке. В противном случае, извлекает верхний элемент из стека.
В конце концов, эта последовательность правильным, если стек пуст.
Почему это правильно? Вот набросок доказательства: если этот алгоритм сообщили, что последовательность будет исправлена, он нашел подходящую пару все скобки. Таким образом, последовательность-это действительно правильно по определению. Если он сообщил об ошибке:
Если стек не пуст, в конце концов, баланс открывающих и закрывающих скобок не равна нулю. Таким образом, это не правильная последовательность.
Если стек был пуст, когда мы должны были поп-элемент, баланс снова.
Если бы был неправильный элемент на вершине стека, пара на "неправильную" в скобках должны соответствовать друг другу. Это означает, что последовательность не правильная.
Я показал, что:
Если алгоритм сообщила, что последовательность правильная, это правильно.
Если алгоритм сообщила, что последовательность не правильная, это некорректно(обратите внимание, что я не пользуюсь тем, что нет никаких других дел, кроме тех, что упомянули в своем вопросе).
Эти два пункта означают, что этот алгоритм работает для всех возможных входов.
Вы're делая некоторые дополнительные проверки, которые арен'т нужна. Не'т делать какие-либо различия в функциональности, но более рациональный способ, чтобы написать код будет такой:
Нет никаких причин, чтобы взглянуть на paranthesis перед извлечением его из стека. Я'd также оборачивать инструкция блоков в parantheses для улучшения читабельности.
Оптимизированная реализация с помощью стеки и переключатель заявление:
Ура !
Ганесан's выше ответ не верный и StackOverflow не позволил мне комментировать или редактировать свой пост. Поэтому ниже приводится правильный ответ. Ганесан имеет неправильную видом на "[" и отсутствует пустой стек() проверить.
Приведенный ниже код будет возвращать true, если брекеты правильно подобранный.
Алгоритм составляет:
В Java-код:
Я думаю, это лучший ответ:
Я видел тут ответы и почти все сделали хорошо. Однако, я написал свою версию, которая использует словарь для управления парами кронштейн и стек для отслеживания заказа обнаруженных брекеты. Я также написал в блоге пост для этого.
Вот мой класс
Я попытался это с помощью JavaScript ниже результат.
Если вы хотите взглянуть на мой код. Просто для справки
Здесь'ы решение в Python.
Было предложено реализовать этот алгоритм в интервью в прямом эфире кодирования, здесь's мой рефакторинг решение на C#:
ГИТ Тесты