基本資料結構 棧(stack)

2021-09-30 13:04:30 字數 1876 閱讀 5660

基本資料結構:棧(stack)

棧(stack)是限制插入和刪除只能在乙個位置上進行的線性表,該位置在表的末端,叫做棧頂。新增元素只能在尾節點後新增,刪除元素只能刪除尾節點,檢視節點也只能檢視尾節點。新增、刪除、檢視依次為入棧(push)、出棧(pop)、棧頂節點(top)。形象的說,棧是乙個先進後出(lifo)表,先進去的節點要等到後邊進去的節點出來才能出來。

如圖1,是乙個棧的形象圖,top指標指向的是棧頂節點,所以我們可以通過top訪問到2節點,但是0和1節點由於先於2進入這個表,所以是不可見的。如果把0節點當做頭節點,2節點當做尾節點,那麼棧限制了訪問許可權,只可以訪問尾節點。

如圖2,當新增乙個節點3的時候,只能在棧頂節點,也就是尾節點後新增,這樣3節點變成了棧頂,2節點變成了不可見節點,訪問的時候只能訪問到3節點。入棧時限制了插入位址,只能在棧頂新增節點。

當我們執行出棧的命令時,圖2的棧頂元素是3節點,刪除的時候只能允許刪除棧頂的元素,這樣子3節點被刪除,top指向刪除後的棧頂2節點,如圖3所示。

棧有兩種是實現結構,一種是順序儲存結構,也就是利用陣列實現,一種是鏈式儲存結構,可以用單鏈表實現。陣列實現棧很簡單,用乙個下標標記top來表示棧頂,top==-1時,棧空,top==0時,表示棧裡只有乙個元素,通過訪問top為下標的陣列元素即可。出棧top自減,入棧top自加就ok了。

**如下:

template

class

stacknode

t data;//值

stacknode* next;//

指向下乙個節點的指標

};template

class

mystack

;template

mystack

::mystack()

template

inline unsigned

int mystack::length()

template

void mystack::push(t x)

template

bool mystack::isempty()

template

void mystack::pop()

template

t mystack

::top()

template

void mystack::clear()

node=null;

headnode=null;

stacklength=0

;}

很清楚,除了clear函式外,所有的方法的時間複雜度都是o(1)。這種實現方式的缺點在於對new和delete的呼叫的開銷是昂貴的,所以採用陣列的方式實現會更好一點。

棧的應用

使用棧的時候一般不用自己重新去寫,因為stl給我們實現了乙個很安全的棧,可以放心去使用。也可以用陣列模擬乙個,很簡單。

編譯器呼叫函式就用了棧結構,當第乙個函式還沒執行完畢,呼叫第二個函式的時候,編譯器就會把第乙個函式壓棧,第二個函式呼叫完畢的時候,就會取棧頂函式,也就是第乙個函式繼續執行。

平衡符號 

中綴轉字尾 

字尾試求值 

poj 3250 

poj 1363 

poj 1208 

poj 1686 

poj 3250 

hdu 1022

基本資料結構 棧(stack)

基本資料結構 棧 stack 棧 stack 是限制插入和刪除只能在乙個位置上進行的線性表,該位置在表的末端,叫做棧頂。新增元素只能在尾節點後新增,刪除元素只能刪除尾節點,檢視節點也只能檢視尾節點。新增 刪除 檢視依次為入棧 push 出棧 pop 棧頂節點 top 形象的說,棧是乙個先進後出 li...

基本資料結構 棧

基本資料結構 棧 一.線性資料結構 我們從四個簡單但重要的概念開始研究資料結構。棧,佇列,deques 雙向佇列 列表是一類資料的容器,它們資料元素之間的順序由新增或刪除的順序決定。一旦乙個資料元素被新增,它相對於前後元素一直保持該位置不變。諸如此類的資料結構被稱為線性資料結構。線性資料結構有兩端,...

基本資料結構 棧

我們從四個簡單但重要的概念開始研究資料結構。棧,佇列,deques 雙向佇列 列表是一類資料的容器,它們資料元素之間的順序由新增或刪除的順序決定。一旦乙個資料元素被新增,它相對於前後元素一直保持該位置不變。諸如此類的資料結構被稱為線性資料結構。線性資料結構有兩端,有時被稱為左右,某些情況被稱為前後。...