首页 > 解决方案 > 为什么即使我将元素推入堆栈,堆栈仍然是空的

问题描述

我正在尝试进行平衡字符串测试。即使我将一个元素推入堆栈也很烦人:stack.push(s.charAt(0)),它仍然在 Stack.StackTest.main(StackTest.java:18) 处显示 EmptyStackException。这是我的代码:

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() == '{' && s.charAt(i) == '}')
            {
                if (!stack.empty())
                {
                    stack.pop();
                }
            }
            else if (stack.peek() == '[' && s.charAt(i) == ']')
            {
                if (!stack.empty())
                {
                    stack.pop();
                }
            }
            else if (stack.peek() == '(' && s.charAt(i) == ')')
            {
                if (!stack.empty())
                {
                    stack.pop();
                }
            }
            else
            {
                stack.push(s.charAt(i));
            }
        }
        
        while (!stack.empty())
        {
            System.out.print(stack.pop());
        }
    }
}

标签: javastack

解决方案


您的堆栈在循环的第一次迭代时不是空的,但第一次迭代会从堆栈中弹出唯一的元素。然后,当您在下一次迭代中调用 时stack.peek(),您会得到EmptyStackException.

您应该将!stack.empty()条件放在stack.peek()语句之前以避免EmptyStackException.

例如,改变

        if (stack.peek() == '{' && s.charAt(i) == '}')
        {
            if (!stack.empty())
            {
                stack.pop();
            }
        }

        if (!stack.isEmpty() && stack.peek() == '{' && s.charAt(i) == '}')
        {
            stack.pop();
        }

你应该以同样的方式改变你的其他条件。


推荐阅读