鏈棧棧是一種特殊的資料儲存結構,採用先進後出的規則,先入棧的元素被**棧的元素「擠壓」在下面,出棧的時候只能等「壓在它身上」的元素都出去以後,它才能出去。就像把東西放進乙個豎桶:
如圖,1
是最先進去的,所以只有別的元素都出去了,它才出得去
c++的庫里其實給我們寫好了棧
這一資料結構,直接呼叫就可以
#include
#include
//stl中棧的標頭檔案
using
namespace std;
stack<
int> s;
//宣告乙個int型的棧
intmain()
while
(!s.
empty()
)return0;
}
輸入:
512345
輸出:
543
21
stl中的棧有如下常用函式
stl雖好,可不要貪杯哦
老師會查**,所以就算你用stl過了,估計也得涼涼
畢竟是初學,為了更好地熟悉棧的基本操作,我們還是需要手寫一下的!
就是用順序表實現棧這一資料結構
#include
#define maxsize 1000
//用來規定棧的大小
using
namespace std;
struct stack
;
top
用來記錄目前棧頂元素的下標,所以它的取值範圍應該是0~maxsize-1
。
初始化時,將top
初始化為-1
,這樣以後判斷棧是不是空的,就可以用if(s.top==-1)
來判斷。
void
initstack
(stack &s)
將乙個元素入棧,需要有兩個步驟:
出棧時很簡單,只要top--
就可以了,因為順序表完全依賴top進行訪問,所以即使top--
後,原來的資料還是存在順序表裡,並沒有受到影響,但一旦有新的元素入棧,在top的影響下新元素會自動覆蓋老元素
void
pop(stack &s)
直接返回即可
int
top(stack s)
while(!
empty
(head)
)
對於判斷棧空的函式,一般的設計規則是棧空則返回1(真),棧非空則返回0(假)。所以只需要這樣寫:
bool
empty
(stack s)
ps.bool
是一種變數型別,就像int
一樣,但不同的是int
型別的變數取值範圍很大,可以是任何乙個整數(不超儲存範圍的前提下),但bool
型的變數只有兩種可能的取值——1
或0
,即true
或false
鏈棧就是用鍊錶實現棧的儲存結構,還是鍊錶那一套操作,甚至它比鍊錶簡單——它白白加了乙個先進後出的限制,搞得你不必考慮尾插法/頭插法建表,不必考慮不刪除情況下的遍歷,只要會一些基本鍊錶操作即可
ps. 我寫完才發現,書上給的鏈棧沒有頭結點,它第乙個結點就開始儲存資料了,而我套用的是鍊錶的模版,所以我給的**是有頭結點的,大家如果有把兩個結合著看的,注意一下這一點!
pps. 鏈棧跟順序棧的區別其實就是換了個載體,所以順序棧的基本思路講解完全可以搬到下面的鏈棧裡來,我就不多寫一遍啦!
struct linkstack
;
void
initlinkstack
(linkstack *
&head)
void
destorylinkstack
(linkstack *
&head)
delete pre;
}
void
push
(linkstack *
&head,
int value)
void
pop(linkstack *
&head)
int
top(linkstack *head)
bool
empty
(linkstack *head)
資料結構與演算法《棧》
概念 棧 stack 又名堆疊,它是一種運算受限的線性表。其限制是僅允許在表的一端進行插入和刪除運算。這一端被稱為棧頂,相對地,把另一端稱為棧底。向乙個棧插入新元素又稱作進棧 入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素 從乙個棧刪除元素又稱作出棧或退棧,它是把棧頂元素刪除掉,使...
棧(資料結構與演算法)
給定乙個只包括 的字串,判斷字串是否有效。有效字串需滿足 左括號必須用相同型別的右括號閉合。左括號必須以正確的順序閉合。注意空字串可被認為是有效字串。示例 1 輸入 輸出 true示例 2 輸入 輸出 true示例 3 輸入 輸出 false示例 4 輸入 輸出 false示例 5 輸入 輸出 tr...
資料結構與演算法 棧
後進先出 lifo last in first out 最後插入的元素最先出來,是一種 操作受限 的線性表,只允許在端插入和刪除資料 順序棧 用陣列實現,順序棧需要動態擴容,在初始化時需要給定乙個固定大小的陣列,當棧大於固定大小時需要擴充陣列的大小。templateclass myarraystac...