1. 程式人生 > >JAVA棧

JAVA棧

現在 face empty bool 指向 都是 last 操作 param

?棧是一種特殊的線性表,棧中的數據元素以及數據元素之間的邏輯關系和線性表相同,兩者之間的差別在於:線性表的插入和刪除操作可以在表的任意位置進行,而棧的插入和刪除操作只允許在表的尾端進行。其中,允許進行插入和刪除操作的一端稱為棧頂,另一端稱為棧底。通常,將元素插入棧的操作叫做入棧(push),而將元素從棧中進行刪除並返回的操作叫做出棧(pop)。棧可以看成是一種受限的特殊的線性表,特殊性體現在它的插入和刪除操作都是控制在線性表的一端進行的。其是一種後進先出(Last In First Out,LIFO)或者先進後出(First In Last Out,FILO)的線性表。

棧的API相關的接口(java):

public interface Stack<T>
{
    public abstract void clear();//將一個已存在的棧置空
    public abstract boolean isEmpty();//判斷棧是否為空
    public abstract int length();//返回棧中數據元素的個數
    public abstract T peek();//讀取棧頂元素並返回其值,但是不將棧頂的值從棧中進行刪除,若棧為空,返回null
    public abstract void push(T x)throws Exception;//將數據元素x壓入棧頂
    public abstract T pop();//刪除並返回棧頂元素
}

?ps:對於棧,其是邏輯結構中線性結構的一種,其可以采用順序存儲結構和鏈式存儲結構。采用順序存儲結構的棧稱為順序棧,采用鏈式存儲結構的棧稱為鏈棧。

?對於棧的實現,其可以通過改進的線性表對象直接進行實現,只要將相應的插入刪除和返回值的操作約束在一端進行即可(對於鏈棧的實現,一般將其約束在頭部進行入棧和出棧操作會節約棧的操作的時間復雜度),此處便不再對其進行實現。其中,通過此方式實現的順序棧,所有的操作時間復雜度均為O(1),對於鏈棧其所有操作的時間復雜度也為O(1)(對於求取長度的操作,書上有些實現的時間復雜度是O(n),但是,實際上只要再加入一個變量對棧的長度在元素出入棧的時候進行統計,即可實現時間復雜度為O(1)的操作)
在java中,其棧可以直接采用Stack a=new Stack();(其中T為泛型變量)的方式進行對象的創建,其相應的類在java.util包中。

鏈棧和順序棧的比較:

?對於鏈棧和順序棧,其棧的所有操作時間復雜度均為O(1),其似乎並沒有什麽區別。但是,鏈棧有一個明顯的優點,便是可以動態的對元素進行添加和刪除,而不需要整體移動棧中的元素。而對於順序棧,由於其數組的大小有一個容量的限制,為此,在超過數組長度的情況下,進行括容時,需要將其原先數組的全部元素完全的復制到增加了長度的數組中,從而時間上會比鏈棧的操作的長。對於鏈棧而言,其不如順序棧的一點在於空間的浪費上要大於順序棧,因為其除了要存儲數據元素的值之外,還要存儲下對應的指向下一個節點的指針。總體而言,個人感覺使用鏈棧會更加好一點。當然,順序棧肯定也有其特點,不然其也不會存在(相信存在即合理),也可能只是個人沒有想到而言,以後想到了再回更。

JAVA棧