資料結構 第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 順序棧結構...