棧的定義,順序棧,鏈式棧

2021-09-26 22:04:54 字數 3898 閱讀 9702

棧又名堆疊,是資料暫時儲存的地方。它一種只能在頂端進行插入和刪除操作的特殊線性表,它按照先進後出的原則儲存資料,先進的資料被壓入棧底,最後的資料在棧頂,需要讀取資料的時候從棧頂開始彈出資料。

棧具有記憶作用,對棧的插入和刪除操作中,不需要改變棧底指標。

棧中允許進行插入和刪除操作的一端稱為棧頂(top),另一端為棧底(bottom);棧底固定,而棧頂浮動;棧中元素個數為零時稱為空棧。插入一般稱為進棧(push),刪除則稱為退棧(pop)棧也稱為後進先出表。

棧的基本操作:出棧pop減一,入棧push加一。

例:設有乙個空棧,棧頂指標是1000h(十六進製制數,下同,且設每個入棧元素需要1個儲存空間)。現有輸入序列a,b,c,d,e,經過push,push,pop,push,pop,push後,棧頂指標是(1002)。

package curri;

public class sqstack

//判斷是否為空棧

public boolean isnull()

//判斷是否棧滿

public boolean isfull()

//壓棧

public boolean push(t value)else

} public t pop()else

}}

測試:

package curri;

import org.junit.test;

public class stack

}

鏈式棧中的元素以node的形式儲存,節點node中存有此節點存於棧中的元素以及指向下個節點的指標。鏈式棧的資料成員只用指向棧頂節點的指標」top_node」。對於鏈式棧而言,**使用了鍊錶來實現棧,鍊錶中的元素儲存在不連續的位址,**由於是動態申請記憶體,所以可以從非常小的記憶體空間開始,另外當某個項不使用時也可以將記憶體返還給系統。

鏈式棧示意圖:

鏈式棧的實現:定義棧陣列

package curri;

public class linkstack

public void initstack()

//是否棧空

public boolean isnull()

//壓棧

public void push(linknodenode)else

} //彈棧

public linknodepop()else

}}

結點:

package curri;

public class linknode

//初始化2

public linknode(t data)

public t getdata()

public void setdata(t data)

public linknodegetnext()

public void setnext(linknodenext)

}

測試

package test;

import org.junit.test;

import curri.linknode;

import curri.linkstack;

public class linkedtest

}

區域性變數是分配在棧上的,new出來的物件時分配在堆上的。所以函式內區域性變數、函式內區域性指標變數是分配在棧上的,而函式內動態申請的物件時分配在堆上的。在呼叫函式時,入參及返回位址使用了棧。因為在函式呼叫過程中形成巢狀時,則應使最後被呼叫的函式被最先返回,後進先出。所以遞迴過程或函式呼叫時,處理引數及返回位址要用棧資料結構。

棧的常見應用:瀏覽器歷史記錄,android中的最近任務,activity的啟動模式,cpu中棧的實現,word自動儲存,解析計算式,解析xml/json。

如:解析xml時,需要校驗節點是否閉合,如必須有之對應,用棧資料結構實現比較好。

儲存結構是資料的邏輯結構用計算機語言的實現,常見的儲存結構有:順序儲存,鏈式儲存,索引儲存以及雜湊儲存。其中雜湊所形成的儲存結構叫做雜湊表(又叫雜湊表),因此雜湊表也是一種儲存結構。棧只是一種抽象資料型別,是一種邏輯結構,棧邏輯結構對應的順序儲存結構為順序棧,對應的鏈式儲存結構為鏈棧,迴圈佇列是順序儲存結構,鍊錶時線性表的鏈式儲存結構。

例1:設棧的順序儲存空間為 s(1:m) ,初始狀態為 top=0 。現經過一系列正常的入棧與退棧操作後, top=m+1 ,則棧中的元素個數為( 不可能 )。

釋:順序棧儲存空間為s(1:m),棧頂指標初始狀態為top=0,即棧空狀態;當棧內有乙個元素時,top=1;當處於棧滿時,top=m。所以棧頂指標的取值範圍是[0,m]之間的整數,因此top=m+1是不可能事件。

應注意的是,如果用一維陣列來作為順序棧的儲存結構,則儲存空間為s[0,m-1]。此時棧頂指標為top=-1,即棧空狀態;當棧內有乙個元素時,top=0;當處於棧滿狀態時,top=m-1。可知,當棧非空時,棧頂指標與陣列下表相對應。棧頂指標top的取值範圍是[-1,m-1]之間的整數。

1.乙個棧的進棧序列是 a , b , c , d , e ,則棧的不可能的輸出序列是()。

a、edcba

b、decba

c、dceab

d、abcde

對於出棧序列的每乙個元素,該元素後比該元素先入棧的一定按照降序排列。

a.abcde進棧,先進後出,則出棧為edcba。

b.abcd進棧,d先出棧,e進棧,然後e出棧,cba依次出棧。

c.錯誤。abcd進棧,d出棧,c出棧。e進棧後再出棧,但此時棧內元素有ab,a在棧底,b在棧頂。因此b應該先出棧。正確順序應該為dceba。

d.a進棧後出棧,b進棧後出棧,而後的元素均進棧後立即出棧,順序合理。

2. 乙個棧的入棧序列為1,2,3,…,n ,其出棧序列是 p 1 ,p 2 ,p 3 ,…p n 。若p 2 = 3,則 p 3 可能取值的個數是(n-1)。

當n=3時,p1=1或2。

p1=1,p2=3時:push,pop(此時p1=1),push,push,pop(此時p2=3),pop(此時p3=2)。

p1=2,p2=3時:push,push,pop(此時p1=2),push,pop(此時p2=3),pop(此時p3=1)。

此時可以看到p3有1和2兩種情況。

當n>3時,p1=1/2/4,因為p2=3,所以p1<=4。

如果 p 1 = 1 , 那麼 p 3 = 2,4,5,… n (n - 2)個。

如果 p 1 = 4 ,那麼 p 3 = 2,5,6,… n (n - 3)個

此時的話我們就可以看到 p 3 的情況有 1,2,4,5,… n (n - 1)個。

綜上所述就是 p 3 可能取值的個數是 (n - 1)個。

棧 棧 鏈式棧,順序棧,共享棧

棧也是一種線性表結構,只不過棧的操作是受限的,它的特點就是在棧頂方向新增新的元素,且刪除元素也只能從棧頂方向刪除。因此棧是一種lifo 後進先出 特性的資料結構。壓棧 新的元素放入棧的操作。出棧 從棧中移除乙個元素的操作。因為棧是一種線性結構,所以可以通過前面所學的鍊錶和順序表作為內部實現。我們可以...

順序棧與鏈式棧型別的定義

順序棧 define stacksize 100 假定預分配的棧的空間為100個元素 typedef char datatype 假定棧元素的資料型別為字元 typedef struct datatype data stacksize 定義棧陣列 int top 定義棧頂 seqtack 鏈式棧 t...

順序棧和鏈式棧

順序棧 採用順序儲存結構的棧 push pop peek 方法的時間複雜度為o 1 當需要擴充棧容量時push 方法的時間複雜度為o n package com.lzw.demo.stacktest public inte ce sstack package com.lzw.demo.stackte...