資料結構 第5講 順序棧

2021-08-08 19:33:39 字數 2964 閱讀 9990

資料結構 第5講 順序棧

小張終於攢錢買了車,可是他家住在胡同的盡頭,胡同很窄,只能通過一輛車,而且是死胡同,每天小張都為停車發愁,回家早了停在裡面,早上上班就要讓所有的人挪車,先讓胡同口那輛出去,然後挨著一輛一輛出去,小張才能去上班。沒辦法,小張下班也不敢早回家了,等天黑了別的車都停進去了,再回去把車停在胡同口,這樣早上就可以第乙個去上班了。就這樣,過起了"起早貪黑"的有車生活。

我們看到這個胡同很窄,只能通過一輛車,而且是死胡同,只能從胡同口進出,畫圖:

小汽車是線性排列,而且只能從一端進出,後進的汽車先出去,這就是"棧",棧也是一種線性表,只不過它是操作受限的線性表,只能在一端操作,後進先出(last in first out,lifo)。

進出的一端稱為棧頂(top),另一端稱為棧底(base)。棧可以用順序儲存,也可以用鏈式儲存。我們先看順序儲存方式:

從上圖可以看出,需要兩個指標,base指向棧底,top指向棧頂。

順序棧的結構體定義:

棧定義好了之後,還要先定義個最大的分配空間,順序結構都是如此,需要預先分配空間,因此可以採用巨集定義:

#define maxsize 100 //預先分配空間,這個數值根據實際需要預估確定;

注意:棧只能在一端操作,後進先出,是人為規定的,也就是說不允許在中間查詢、取值、插入、刪除等操作,但順序棧本身是順序儲存的,有人就想我非要從中間取乙個元素,那肯定可以取出來,沒有問題,但是這樣做,就不是棧了。不按套路出牌啊~~~

下面講解順序棧的初始化、入棧,出棧,取棧頂元素等操作(元素以int型別為例)。

1. 順序棧初始化

初始化乙個空棧:

bool initstack(sqstack &s) //構造乙個空棧s

2. 入棧

入棧前要判斷是否棧滿,如果棧已滿,則入棧失敗,否則將元素放入棧頂,棧頂指標向上移動乙個空間(top++)。

bool push(sqstack &s, int e) // 插入元素e為新的棧頂元素

3. 出棧

出棧前要判斷是否棧空,如果棧是空的,則出棧失敗,否則將棧頂元素暫存給乙個變數,棧頂指標向下移動乙個空間(top--)。

棧頂元素所在的位置實際上是s.top-1,因此把該元素取出來,暫存在變數e中,然後s.top指標向下移動乙個位置。既然這樣乾脆先移動,即--s.top,然後再取元素就可以了。

例如4出隊後:

注意:因為順序儲存刪除乙個元素時,並沒有銷毀該空間,所以4其實還在那個位置,只不過下次再有元素進棧時,就把它覆蓋了。相當於該元素已出棧,因為棧的內容是s.base 到s.top-1。

bool pop(sqstack &s, int &e) //刪除s的棧頂元素,暫存在變數e中    

4. 取棧頂元素

取棧頂元素和出棧不同,取棧頂元素只是把棧頂元素複製乙份,而出棧是指棧內不再包含這個元素。

例如取棧頂元素*(s.top-1),即元素4,取值後s.top的值沒有改變,棧內元素的個數也沒有改變。

int gettop(sqstack s) //返回s的棧頂元素,棧頂指標不變

順序棧基本操作完整**:

完整**:

#includeusing namespace std;

#define maxsize 100 //預先分配空間,這個數值根據實際需要預估確定;

typedef struct sqstack sqstack;

bool initstack(sqstack &s) //構造乙個空棧s

bool push(sqstack &s, int e) // 插入元素e為新的棧頂元素

bool pop(sqstack &s, int &e) //刪除s的棧頂元素,暫存在變數e中

int gettop(sqstack s) //返回s的棧頂元素,棧頂指標不變

int main()

cout <

執行結果:

C語言資料結構 5 順序棧

棧應該是第一次出現乙個很專業名詞的資料結構了吧,但是棧依然是乙個非常簡單一維結構。之所以稱之為棧,就是因為棧的特點是後進先出,就像乙個貨棧,先放進去東西總是放在裡面,後放進去的東西放到門口,所以往外拿出來的時候,就先拿出來門口的。我們把線性表看為從上到下的乙個一維結構,不管是往線性表裡新增元素還是取...

資料結構 順序棧

編寫乙個程式,實現順序棧 假設棧中元素型別為char 的各種基本運算。並完成下面功能 1 初始化棧s 2 判斷棧s是否非空 3 依次進棧元素a,b,c,d,e 4 判斷棧s是否非空 5 輸出棧長度 6 輸出從棧頂到棧底元素 7 輸出出棧序列 8 判斷棧s是否非空 9 釋放棧。include incl...

資料結構 順序棧

構造乙個順序棧 當輸入9999時,結束入棧操作 輸出棧中元素,顯示棧頂元素,刪除棧頂元素 include include include define stack init size 100 define ok 1 define error 0 typedef int selemtype 順序棧結構...