Java中的Stack发生EmptyStackException错误

时间:2012-12-03 23:33:07

标签: java stack

我要做的是获取eval变量,将每个字母放入堆栈然后打印出来。我收到一个EmptyStackException错误(假设这表示堆栈中没有任何内容)。我不明白的是我认为eval字符串被放入变量堆栈。为什么它是空的?

public static void main(String[] args)
{

   Stack<String> variable = new Stack<String>();

   String eval = StdIn.readString();
   String alphabet = "abcdefghjiklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";


   for (int i = 0; i < eval.length(); i++)
   {
       eval = eval.substring(i,i);

       if (eval.equals(alphabet.substring(0, 52)))// checks if eval is equal to any letter of alphabet
     {
           variable.push(eval);

       System.out.println(variable.pop());
     }
   } 
  }
}

我正在使用eclipse


示例运行:

input: hello
Exception in thread "main" java.util.EmptyStackException
at java.util.Stack.peek(Unknown Source)
at java.util.Stack.pop(Unknown Source)
at eval.main(eval.java:31)

5 个答案:

答案 0 :(得分:4)

获得此错误的唯一方法是:

for (int i = 0; i < eval.length(); i++)
   {
       eval = eval.substring(i,i);

       if (eval.equals(alphabet.substring(0, 52)))
     {
           variable.push(eval);


     }
 System.out.println(variable.pop());
   } 

如果你有System.out.println(variable.pop());在if条件之外。

<强> pop

public Object pop()
  

移除此堆栈顶部的对象并将该对象返回为   这个函数的价值。

     

返回:此堆栈顶部的对象(最后一项)   矢量对象)。抛出:

EmptyStackException - 如果此堆栈为空。

在您发布的代码中,由于您具有相同数量的pushpop,因此push操作优先于pop。< / p>

您提供的代码

enter image description here

您遇到的错误

enter image description here

答案 1 :(得分:3)

我可以看到一些问题:

  1. eval.substring(i,i);每次都会返回一个空字符串。您需要eval.substring(i,i + 1);,甚至更好,eval.charAt(i);

  2. 您需要将返回的substring / charAt字符放在for循环中的变量中。目前,它在第一次迭代后覆盖eval字符串。

  3. if (eval.equals(alphabet.substring(0, 52)))并没有按照您的评论判断出您的想法。如果要检查字符串是否包含其他字符串(或者甚至只包含单个字符),请使用以下方法:String#containsString#indexOf


  4. 这是一个简单的纠正片段:

        String alphabet = "abcdefghjiklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
        String eval = "blah";
        Stack<Character> chars = new Stack<Character>();
    
        for(char c : eval.toCharArray()) {
            if(alphabet.indexOf(c) != -1) {
                chars.push(c);
                System.out.println(chars.pop());
            }
        }
    

答案 2 :(得分:2)

您需要检查eval中的每个字母是否都是一个字母,然后再将其推入堆栈。在浏览eval中的所有字符后,将所有字符从堆栈中弹出并打印出来。

for(int i = 0; i < eval.length(); i++) {

    if(alphabet.contains(eval.charAt(i))) {

        variable.push(eval.charAt(i));
    }
}

while(!variable.isEmpty()) {

    System.out.println(variable.pop());
}

答案 3 :(得分:1)

这可以解决您的问题: 你应该只是在你推后弹出。因此,它们都应该在if语句中。

    for (int i = 0; i < eval.length(); i++)
    {
       if (alphabet.contains(eval.substring(i,i+1))
       {
           variable.push(eval.substring(i,i+1));
           System.out.println(variable.pop());
       }
     } 

答案 4 :(得分:0)

您想检查从输入读取的字符串中的字符是否为字母,并将它们放在stac中 您应该考虑使用Character class,它允许您对字符执行所有类型的测试,而不必担心编码。在您的情况下可能有用的方法是isLetter,它检查字符是否为字母。

至于堆栈问题,你的代码实际上在堆栈顶部推送一个值,然后立即pop它,这解释了为什么你的堆栈在循环结束时是空的。您应该使用peek方法。