2

我要做的是让 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());
     }
   } 
  }
}

我使用日食


样品运行:

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)
4

5 回答 5

6

我可以看到一些问题:

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

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

  3. if (eval.equals(alphabet.substring(0, 52)))从您的评论来看,它并没有像您认为的那样做。如果您想检查一个字符串是否包含另一个字符串(甚至只是一个字符),请使用方法:String#containsString#indexOf.


这是一个简单的更正片段:

    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());
        }
    }
于 2012-12-03T23:41:15.970 回答
6

您收到此错误的唯一方法是:

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 条件的外部。

流行音乐

public Object pop()

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

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

EmptyStackException - 如果此堆栈为空。

在您发布的代码中,这是不可能的,因为您有相同数量的pushand pop,并且push操作比pop.

你放的代码

在此处输入图像描述

你得到的错误

在此处输入图像描述

于 2012-12-03T23:42:27.837 回答
3

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());
}
于 2012-12-03T23:44:57.130 回答
2

这应该可以解决您的问题:您应该只在推送后弹出。因此,它们都应该在 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());
       }
     } 
于 2012-12-04T00:11:43.023 回答
1

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

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

于 2012-12-03T23:56:08.720 回答