Сбалансированные выражения Java проверяют {[()]} с несколькими строками

У меня есть небольшой код для проверки выражений баланса {[()]}.

В main я использовал:

String s = reader.nextLine();
System.Out.println (process(s));

Код:

public static boolean process(String s) {
    Stack<Character> stack  = new Stack<Character>();
    for(int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);
        if (c == '[' || c == '(' || c == '{' ) {     
            stack.push(c);
        } else if (c == ']') {
            if (stack.isEmpty() || stack.pop() != '[') {
                return false;
            }
        } else if (c == ')') {
            if (stack.isEmpty() || stack.pop() != '(') {
                return false;
            }           
        } else if (c == '}') {
            if (stack.isEmpty() || stack.pop() != '{') {
                return false;
            }
        }   
    }
    return stack.isEmpty();
}

Это нормально, если

Input : Hello (the [first] I will see in (heaven) is a score list).
Output : True

Но если у меня есть ввод с несколькими, это не сработает

Input : So when I die (the [first] I will see in (heaven) is a score list).

[ first in ] ( first out ).
Half Moon tonight (At least it is better than no Moon at all].

Output : True

Реальный объем производства должен быть:

True
True 
False

Я не знаю почему? Помогите, пожалуйста.

Как вы читаете вводные? Возможно, вы передаете методу процесса только первую строку

user7 15.03.2018 12:49

Как вы называете метод процесса?

pavithraCS 15.03.2018 12:50

Я использовал String s = reader.nextLine();

Nguyen 15.03.2018 12:56

Чтение ввода из файла?

pavithraCS 15.03.2018 12:58

Ваша функция выглядит нормально, добавьте код, который ее вызывает

Roy Shmuli 15.03.2018 12:59

Я только что отредактировал свой пост.

Nguyen 15.03.2018 14:28

Обратите внимание, что класс Stack устарел. Даже собственный Javadoc предлагает вместо этого использовать реализации интерфейса Deque. Как ArrayDeque. См. здесь: «Более полный и последовательный набор операций стека LIFO обеспечивается интерфейсом Deque и его реализациями, которые следует использовать вместо этого класса. Например: Deque<Integer> stack = new ArrayDeque<Integer>();»

Zabuzard 15.03.2018 14:29

Он печатает только «Истина», если это так, потому что вы читаете только в первый раз и вызываете функцию только один раз.

Roy Shmuli 15.03.2018 14:44
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
8
98
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Учитывая, что вы используете reader.nextLine(), я предполагаю, что ваш reader - это java.util.Scanner

Вы передаете только первую строку, поэтому пропустите все строки ввода и игнорируйте пустые:

Scanner reader = new Scanner(System.in);
while(reader.hasNext()) {
  String s = reader.nextLine();
  if (s.trim().length() > 0) {
    System.out.println (process(s));
  }
}

Это должно вызвать process 3 раза со следующими строками:

  • So when I die (the [first] I will see in (heaven) is a score list).
  • [ first in ] ( first out ).
  • Half Moon tonight (At least it is better than no Moon at all].

Другие вопросы по теме