У меня есть небольшой код для проверки выражений баланса {[()]}.
В 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
Я не знаю почему? Помогите, пожалуйста.
Как вы называете метод процесса?
Я использовал String s = reader.nextLine();
Чтение ввода из файла?
Ваша функция выглядит нормально, добавьте код, который ее вызывает
Я только что отредактировал свой пост.
Обратите внимание, что класс Stack устарел. Даже собственный Javadoc предлагает вместо этого использовать реализации интерфейса Deque. Как ArrayDeque. См. здесь: «Более полный и последовательный набор операций стека LIFO обеспечивается интерфейсом Deque и его реализациями, которые следует использовать вместо этого класса. Например: Deque<Integer> stack = new ArrayDeque<Integer>();»
Он печатает только «Истина», если это так, потому что вы читаете только в первый раз и вызываете функцию только один раз.




Учитывая, что вы используете 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].
Как вы читаете вводные? Возможно, вы передаете методу процесса только первую строку