Java 为什么即使我将一个元素推入堆栈,它仍然是空的

Java 为什么即使我将一个元素推入堆栈,它仍然是空的,java,stack,Java,Stack,我想做一个平衡字符串测试。非常恼人的是,即使我将一个元素推入堆栈: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 s

我想做一个平衡字符串测试。非常恼人的是,即使我将一个元素推入堆栈: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());
        }
    }
}
import java.util.Stack;
公共类堆栈测试
{
公共静态void main(字符串[]args)
{
//扫描仪=新的扫描仪(System.in);
堆栈=新堆栈();
int i;
字符串s=“{}(){}{}{}”;
堆栈推送(s.charAt(0));
对于(i=1;i
在循环的第一次迭代中,堆栈不是空的,但第一次迭代将从堆栈中弹出唯一的元素。然后,在下一次迭代中调用
stack.peek()
,就会得到
EmptyStackException

你应该把
!stack.empty()
stack.peek()
语句之前的条件,以避免出现
EmptyStackException

例如,改变

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


您应该以同样的方式更改其他条件。

好吧,在第一个循环中,
}else如果(stack.peek()='['&&s.charAt(i)=']']){
被触发,您弹出堆栈中的唯一元素,那么现在它是空的
        if (!stack.isEmpty() && stack.peek() == '{' && s.charAt(i) == '}')
        {
            stack.pop();
        }