#java #stack
Вопрос:
Я пытаюсь провести тест на балансировку строк. Очень раздражает, что даже если я вставил элемент в стек: stack.push(s.charAt(0)), он все равно говорит исключение EmptyStackException в стеке.StackTest.main(StackTest.java:18). Вот мой код:
import java.util.Stack;
public class StackTest
{
public static void main (String[] args)
{
//Scanner scanner = new Scanner(System.in);
Stack<Character> stack = new Stack<>();
int i;
String s = "{}(){}{}{}";
stack.push(s.charAt(0));
for (i = 1;i < s.length();i )
{
if (stack.peek() == '{' amp;amp; s.charAt(i) == '}')
{
if (!stack.empty())
{
stack.pop();
}
}
else if (stack.peek() == '[' amp;amp; s.charAt(i) == ']')
{
if (!stack.empty())
{
stack.pop();
}
}
else if (stack.peek() == '(' amp;amp; s.charAt(i) == ')')
{
if (!stack.empty())
{
stack.pop();
}
}
else
{
stack.push(s.charAt(i));
}
}
while (!stack.empty())
{
System.out.print(stack.pop());
}
}
}
Комментарии:
1. Ну, в первом цикле у
} else if (stack.peek() == '[' amp;amp; s.charAt(i) == ']') {
вас сработал, и вы выскочили единственным элементом в стеке, так что теперь он пуст
Ответ №1:
Ваш стек не пуст на первой итерации цикла, но на этой первой итерации появляется единственный элемент из стека. Затем, когда в следующей итерации вы позвоните stack.peek()
, вы получите EmptyStackException
.
Вы должны поставить !stack.empty()
условие перед stack.peek()
заявлением, чтобы избежать EmptyStackException
.
Например, изменить
if (stack.peek() == '{' amp;amp; s.charAt(i) == '}')
{
if (!stack.empty())
{
stack.pop();
}
}
Для
if (!stack.isEmpty() amp;amp; stack.peek() == '{' amp;amp; s.charAt(i) == '}')
{
stack.pop();
}
Вы должны изменить свои другие условия таким же образом.