【问题标题】:Why is stack still empty even when I pushed an element into it为什么即使我将元素推入堆栈,堆栈仍然是空的
【发布时间】:2021-07-19 12:07:31
【问题描述】:

我正在尝试进行平衡字符串测试。即使我将一个元素推入堆栈也很烦人: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());
        }
    }
}

【问题讨论】:

  • 好吧,在你的第一个循环中,} else if (stack.peek() == '[' &amp;&amp; s.charAt(i) == ']') { 被触发并且你弹出堆栈中唯一的元素,所以现在它是空的

标签: java stack


【解决方案1】:

您的堆栈在循环的第一次迭代时不是空的,但第一次迭代会从堆栈中弹出唯一的元素。然后,在下一次迭代中调用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();
        }

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

【讨论】:

    猜你喜欢
    • 2019-05-23
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    • 2020-05-27
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多