Почему стек все еще пуст, даже когда я вставил в него элемент

#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();
        }
 

Вы должны изменить свои другие условия таким же образом.