1. 程式人生 > >棧的定義,兩種基本的儲存結構:順序儲存結構和鏈式儲存結構

棧的定義,兩種基本的儲存結構:順序儲存結構和鏈式儲存結構

棧的定義

棧(stack )又稱堆疊,它是運算受限的線性表。
其限制是僅允許在表的一端進行插入和刪除操作,不允許在其他任何位置進行插入、查詢、刪除等操作。
表中進行插入、刪除操作的一端稱為 棧頂(top) ,棧頂儲存的元素稱為 棧頂元素。
相對的,表的另一端稱為棧底(bottom) 

當棧中沒有資料元素時稱為空棧;
向一個棧插入元素又稱為 進棧或 入棧;
從一個棧中刪除元素又稱為 出棧或 退棧。
由於棧的插入和刪除操作僅在棧頂進行,後進棧的元素必定先出棧,
所以又把堆疊稱為 後進先出表(Last In First Out,簡稱 LIFO) 

生活案例:摞盤子和取盤子、一摞書、酒杯塔(各層之間可以簡單理解為棧,每層內部不是棧)
技術案例:Java的棧記憶體 

棧介面,定義了棧的主要操作
    記住針對棧的專業詞彙:push、pop、peek 

public interface Stack {
    // 返回堆疊的大小
    public int getSize();
 
    // 判斷堆疊是否為空
    public boolean isEmpty();
 
    // 資料元素 e 入棧
    public void push(Object e);
 
    // 棧頂元素出棧
    public Object pop();
 
    // 取棧頂元素
    public Object peek();
}

 

棧的儲存結構
順序棧
和線性表類似,堆疊也有兩種基本的儲存結構:順序儲存結構和鏈式儲存結構。
順序棧是使用順序儲存結構實現的堆疊,即利用一組地址連續的儲存單元依次存放堆疊中的資料元素。
由於堆疊是一種特殊的線性表,因此線上性表的順序儲存結構的基礎上,選擇線性表的一端作為棧頂即可。
根據陣列操作的特性,選擇陣列下標大的一端,即線性表順序儲存的表尾來作為棧頂,此時入棧、出棧等操作可以在Ο(1)時間完成。
由於堆疊的操作都在棧頂完成,因此在順序棧的實現中需要附設一個指標 top 來動態的指示棧頂元素在陣列中的位置。
通常 top 可以用棧頂元素所在陣列下標來表示,top= -1 時表示空棧。


鏈棧
鏈棧即採用連結串列作為儲存結構實現的棧。
當採用單鏈表儲存線性表後,根據單鏈表的操作特性選擇單鏈表的頭部作為棧頂,此時,入棧、出棧等操作可以在Ο(1)內完成。
由於堆疊的操作只在線性表的一端進行,在這裡使用帶頭結點的單鏈表或不帶頭結點的單鏈表都可以。
使用帶頭結點的單鏈表時,結點的插入和刪除都在頭結點之後進行;
使用不帶頭結點的單鏈表時,結點的插入和刪除都在連結串列的首結點上進行。