鏈式棧是一種資料儲存結構,可以通過單鏈表的方式來實現,使用鏈式棧的優點在於它能夠克服用陣列實現的順序棧空間利用率不高的特點,但是需要為每個棧元素分配額外的指標空間用來存放指標域。棧是只能在某一端插入和刪除的特殊線性表。它按照後進先出的原則儲存資料,先進入的資料被壓入棧底(push),最後的資料在棧頂(top),需要讀資料的時候從棧頂開始彈出資料(top)最後乙個資料被第乙個讀出來。鏈式棧中的元素以node的形式儲存,節點node中存有此節點存於棧中的元素以及指向下個節點的指標。鏈式棧的資料成員只用儲存指向棧頂節點的指標 *top_node。
順序棧的實現在於使用了陣列這個基本資料結構,陣列中的元素在記憶體中的儲存位置是連續的,且編譯器要求我們在編譯期就要確定陣列的大小,這樣對記憶體的使用效率並不高,一來無法避免因陣列空間用光而引起的溢位問題,二在系統將記憶體分配給陣列後,則這些記憶體對於其他任務就不可用;而對於鏈棧而言,使用了鍊錶來實現棧,鍊錶中的元素儲存在不連續的位址,由於是動態申請記憶體,所以我們可以以非常小的記憶體空間開始,另外當某個項不使用時也可將記憶體返還給系統。
利用c++語言實現了資料結構的鏈式棧,主要完成了以下操作:
鏈式棧的
基本操作
元素進棧
元素出棧
返回棧頂元素
判斷棧是否為空
列印棧的元素
鏈式棧的結點
鏈式棧的結點其實跟鏈式結構的順序結構差不多類似,包含兩部分,一是儲存資料的資料域,二是儲存下一結點位址的指標域,因此以結構體封裝的結點如下:
template
<
class
t>
struct chainstacknode
;
鏈式棧的基本操作
在寫這次鏈式棧的時候,我在所有的函式實現前都加上了inline,在這裡給大家解釋一下。inline是c++關鍵字,在函式宣告或定義中,函式返回型別前加上關鍵字inline,即可以把函式指定為內聯函式。這樣可以解決一些頻繁呼叫的函式大量消耗棧空間(棧記憶體)的問題。關鍵字inline必須與函式定義放在一起才能使函式成為內聯函式,僅僅將inline放在函式宣告前面不起任何作用。inline是一種「用於實現」的關鍵字,而不是一種「用於宣告」的關鍵字。
建構函式
建構函式,就是實現成員的初始化操作,當然在這裡實現鏈式棧的初始化就只需要建立乙個頭指標,並初始化頭指標的各個成員。
template
<
class
t>
inline chainstack
::chainstack()
元素進棧
鏈式棧的進棧操作,顧名思義就是乙個新的元素進入棧,當然首先要建立乙個新的結點,然後就是將這個新的結點插入到棧頂,只需要調整來兩個指標操作。
template
<
class
t>
inline
bool chainstack
::push
(t newdata)
newnode-
>data = newdata;
//修改指標,新增元素
newnode-
>next = top-
>next;
top-
>next = newnode;
return
true
;}
元素出棧
元素出棧,就跟線性表的刪除元素類似,不過只能刪除頂部結點,這個棧的特性是不可以違背的,調整指標刪除結點之後不要忘了釋放刪除的結點的記憶體。
template
<
class
t>
inline
bool chainstack
::pop
(t &x)
else
}
返回棧頂元素
返回棧頂的元素,判斷棧是否為空,如果為空自然沒有元素可以返回,否則就返回top指向的下乙個結點的資料即可。
template
<
class
t>
inline
bool chainstack
::gettop
(t &x)
else
}
判斷棧是否為空
有了top指標,就只需要判斷top指標的下一結點是否為空即可。
template
<
class
t>
inline
bool chainstack
::isempty()
else
}
列印棧的元素
列印棧的元素,就是乙個遍歷的過程,定義乙個指標,輸出結點資料,調整指標位置。
template
<
class
t>
inline
void chainstack
::printchainstackdata()
cout<<
"["<>data<<
"]"<}
C語言實現棧(鏈式棧)
由於棧的插入 刪除操作只能在一端進行,而對於線性鍊錶來說,在首端插入或 刪除比在尾端要容易一些,所以,將線性鍊錶的首端作為棧頂端,即將頭指標作為棧頂指標。1 結構體 1 typedef struct nodenode 56 typedef struct my stackstack 2 初始化 1 s...
用C語言實現鏈式棧介紹
目錄 堆疊是只能在一端增刪元素的表結構,該位置稱為棧頂堆疊的基本運算是壓入和彈出,前者相當於插入,而後者則是刪除最後插入的元素,形成後進先出的運算規則最後插入的元素在被彈出之前可以作為棧頂被外界訪問從空棧中彈出,或向滿棧中壓入,都被認為是一種錯誤 順序棧鏈式棧 include include 節點的...
! 順序棧與鏈式棧的C語言實現 !
基本操作 入棧 出棧 取棧頂元素 基本特性 先進後出 注意 棧本身不能遍歷,不能列印,我們在 中實現的列印只是為了檢查 的正確性 具體操作的詳細解釋在 中會有注釋。1.順序棧 在結構體內定義乙個變數以 使用malloc申請記憶體,從而實現將順序表的固定長度修改為可動態擴容 seqstack.h pr...