Вводится символьная строка, в которой записано выражение со скобками трех типов: [], {} и (). Определить, верно ли расставлены скобки

(не обращая внимания на остальные символы)

Вывод:
Скобки расставлены правильно
Скобки расставлены неправильно

code: #java
import java.util.Stack;
 
 
public class Exercise4 {
 
        private static final char rob = '(';
        private static final char rcb = ')';
        private static final char sob = '[';
        private static final char scb = ']';
        private static final char cob = '{';
        private static final char ccb = '}';
 
        public static boolean isCorrectBrackets(String value) {
                Stack<Character> stack = new Stack<Character>(); // создаем стек, куда будем помещать скобки
                char[] array = value.toCharArray(); // разбиваем строку на массив символов
                for(char c : array) {  // для каждого символа в массиве
                        if((c == rcb || c == scb || c == ccb) && stack.empty()) { // если символ является закрывающей скобкой И стек пустой
                                return false; // сразу возвращаем false, т.к. закрывающая скобка не может идти первой
                        }
 
                        if(c == rob || c == sob || c == cob) { // если символ является открывающей скобкой,
                                stack.push(c); // заталкиваем его в стек
                        }
 
                        if((c == rcb || c == scb || c == ccb) && !stack.empty()) { // если символ является закрывающей скобкой и стек НЕ пустой (т.е там уже находится одна или более открывающих скобок),
                                char t = stack.peek(); // создаем временную переменную, в которую помещаем символ, находящийся "сверху" в стеке. Этот метоод не удаляет элемент из стека
                                switch(c) { // оператором выбора определяем символ
                                case ')': // если это закрывающая круглая скобка
                                        if(t == '(') stack.pop(); // если наверху стека находится открывающая круглая скобка, то удаляем ее из стека. Таким образом, как-бы отбрасываются корректные пары скобок
                                        break;
                                case ']':  // аналогично для других скобок
                                        if(t == '[') stack.pop();
                                        break;
                                case '}':
                                        if(t == '{') stack.pop();
                                        break;
                                }
                        }
                }
                if(stack.empty()) { // если стек оказался пуст - значит у каждой скобки была своя корректная пара
                        return true;
                } else { // если нет - значит скобки были расставлены неправильно
                        return false;
                }
        }
 
        public static void main(String[] args) {
                // тестируем
 
                String example = "44*(55 - 1) + { 12 + [1;1] - x } / (54 +1)*2 = ?";
                if(isCorrectBrackets(example)) {
                        System.out.println("Скобки расставлены правильно");
                } else {
                        System.out.println("Скобки расставлены неправильно");
                }
 
                example = "34 - [21;21(x+y]) + { 12 - 12 } ";
                if(isCorrectBrackets(example)) {
                        System.out.println("Скобки расставлены правильно");
                } else {
                        System.out.println("Скобки расставлены неправильно");
                }
 
        }
 
}

автор: exiqa

Поделиться:

Похожие статьи: