2012-02-29 76 views
1

我需要從數組中填充堆棧,然後按順序打印出元素,然後再次顛倒順序。我遇到的問題是我得到一個ArrayIndexOutOfBoundsException並且不知道它來自哪裏。我已經嘗試通過調試運行,它看起來像彈出元素永遠不會到達最後一個元素。下面是我的代碼:java stack從數組中讀取ArrayIndexOutOfBoundsException

public class arrayStack { 

    private int top; 
    private String[] storage; 

    public arrayStack(int capacity) 
    { 
     storage = new String[capacity]; 
     top = -1; 
    } 

    public boolean isEmpty() { 
     return (top == 0); 
    } 

    String peek() { 
     return storage[top];  
    } 

    String pop() { 
     top--; 
     return storage[top]; 
    } 

    public void push(String str) { 
     top++; 
     storage[top] = str; 
    } 

} 

StackMain.java:

public class StackMain { 

    public static void main(String[] args) { 
     //int j = 5; 
     String[] list = new String[5]; 

     list[0] = "Beware"; 
     list[1] = "The"; 
     list[2] = "Ides"; 
     list[3] = "Of"; 
     list[4] = "March"; 

     arrayStack stack = new arrayStack(5); 

     for(int i = 0; i < list.length; i++) 
     { 
      stack.push(list[i]); 
     } 

     for(int j = 0; j < list.length; j++) 
      System.out.println(stack.pop()); 

    } 

} 

回答

3

pop(),你需要返回已彈出的項目,這是top舊值的索引處的項目。乾淨的方法是將功能改成

String pop() { 
    return storage[top--]; 
} 

編輯
你也需要改變isEmpty()return (top == -1)。您也可以更改實施以使用size(元素數量)而不是像其他人提到的top(最高元素的索引)。

+0

非常感謝你,這是一個簡單的答案,我已經奮鬥了整個下午更靈活的協議棧實現。 – user519670 2012-02-29 02:22:40

1

在您的構造函數arrayStack中,應該將top設置爲0,而不是-1。在你的isEmpty方法中,你甚至會檢查top == 0,所以清楚top == 0表示空,而不是top == -1。這就是爲什麼當彈出堆棧中的值時總是錯過最後一個元素;把第一個元素增加top爲0.

哦,我錯過了湯姆說的,下面:遞減top之前,你會發現在頂部的值將返回錯誤的元素。下面一行代碼是可取的,但,這可能是更容易理解的初學者:

public String pop() { 
    String topValue = storage[top]; 
    top--; 
    return topValue; 
} 
+0

非常感謝你 – user519670 2012-02-29 02:23:37

1

如果push(String)只有一個元素,與頂級初始化爲-1,將頂部的值是什麼推後?

現在看看你的pop()功能,頂部遞減之前試圖讓該元素的要求,那麼,這將試圖訪問,如果你推一個元素是什麼數組索引?

1

由於你在-1處開始top,一旦你從String數組中添加了5個元素,top將會是4,這是不正確的,因爲你有5個元素。

然後,當你試圖彈出堆棧5次,top追溯到-1和storage[-1]不爲0

或者存在這樣你就得到一個ArrayIndexOutOfBoundsException

開始top如果遞減top從您的堆棧中檢索元素後,您將不會收到錯誤;但是將top設置爲0會更好,因爲top實際上代表了堆棧中元素的數量。

+0

非常感謝您! – user519670 2012-02-29 02:22:13

1

請將問題標記爲家庭作業。問題來了,問題出在pop()函數中。您先遞減頂部的值,然後返回元素。但是,當你檢查push()函數時,你先遞增然後添加元素。所以,如果將top--從堆棧中獲取元素後,您的問題將得到解決。

1

您的彈出方法不正確。在您的代碼中,頂部從負數1開始。

當您按下某個元素時,頂部變爲0. 當您彈出某個元素時,頂部在訪問該元素之前變爲-1。

此外,您的空方法不正確。在堆棧的初始狀態中,top = -1,isEmpty檢查它是否返回0.最初堆棧應該是空的。

1

你的pop()函數必須改變。你必須存儲的存儲[流行]在一個臨時變量,然後減少1頂部,然後返回臨時變量

1

這將是巨大的,如果你可以包含的Java 1.5的通用設備來實現stack.Then你的籌碼將更加靈活。它可以保存任何類型的對象(在你的情況下僅字符串) 還有一個建議是,在彈出的方法你應該告訴垃圾收集丟棄到POP操作對象,如下所示。 (在這種情況下,如果你使用的是仿製藥),以下是其在有效的Java版提到的2

// Initial attempt to generify Stack = won’t compile! 
public class Stack<E> { 
private E[] elements; 
private int size = 0; 
private static final int DEFAULT_INITIAL_CAPACITY = 16; 
public Stack() { 
elements = (E[])new E[DEFAULT_INITIAL_CAPACITY]; 
} 
public void push(E e) { 
ensureCapacity(); 
elements[size++] = e; 
} 
public E pop() { 
if (size==0) 
throw new EmptyStackException(); 
E result = elements[--size]; 
elements[size] = null; // Eliminate obsolete reference 
return result; 
}