2012-12-03 62 views
0

我想要做的是让eval变量将每个字母放入一个堆栈然后打印出来。我得到一个EmptyStackException错误(假设这意味着堆栈中没有任何东西)。我不明白的是我认为eval字符串被放入变量堆栈。为什么它是空的?Stack Stack in Empty EmptyStackException错误

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) 
+3

您的代码要求eval匹配整个字母表。 – nullpotent

+1

这里要做的一件有用的事情是发布一些示例运行和回溯。 – Colleen

+0

eval等于我输入的任何单词。例如,我希望程序通过在单独一行中打印每个字母来打印“单词”。 – iii

回答

3

有一些问题,我可以看到:

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

  2. 您需要在for循环中将返回的子字符串/ charAt字符放入其自己的变量中。目前它在第一次迭代之后覆盖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()); 
     } 
    } 
+0

请参阅我想使用eval.CharAt(i),但它表示我无法将字符串转换为字符。 – iii

+1

使用eval.substring(i,i + 1)将满足此要求。 –

+0

@igknighton我为你提供了一个例子。 –

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());外的如果条件。

pop

public Object pop() 

在移除这堆和该对象作为 该函数的返回值的顶部的对象。

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

EmptyStackException - 如果此堆栈为空。

在您发布此代码是不可能的,因为您有相同数量的pushpop,并且push操作首先比pop

你已经把代码:

enter image description here

你得到错误:

enter image description here

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()); 
} 
0

您要检查从输入读取一个字符串中的字符是否是字母,并把它们放在一个STAC 您应该考虑使用它让你执行所有排序对字符的测试,而无需将Character class担心编码。在你的情况下可能有用的方法是isLetter,它检查字符是否是字母。

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

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()); 
     } 
    }