2012-12-03 82 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()); 
     } 
    }