本章知識介紹資料結構書上的第三章棧和佇列,其中棧的知識重點放在應用上,因為基本操作較簡單,而且c語言和c++都有現成的操作棧和佇列的stack<>和queue<>。
棧是限定僅在表尾進行插入或刪除操作的線性表。表尾端稱為棧頂,表頭端稱為棧底。另外棧是先進後出(lifo)的線性表。
棧也是資料結構或者筆試考察的基本知識,經常會有選擇題或者填空題,例如阿里筆試的選擇題13題
1.原選擇題第13題:有堆疊s,按照順序abcd進棧,則不可能出棧的順序是哪個選項,這種選擇題,只要仔細分析就不會錯,但是一定要認真,切勿大意。
2.還有一種填空題,求n個元素的所有不同出棧順序共有多少種,比如abcd進棧,一共有多少種出棧順序,當然你可以自己乙個乙個列舉,但是有數學公式就是1/(n+1)*c(2n,n)(因為上標和下標的不好畫,這裡的c代表求組合數,2n是下標,n是上標),可求得答案是1/5*c(8,4)=14,我記得這個好像叫卡特蘭數,原來看過離散數學的書裡面有,組合數學裡面也有,但是都沒學過,具體原理或者推導還是看書吧。
我採取的是用順序儲存結構實現的,就是用陣列,如果是鏈式結構,就用上一章介紹的鍊錶,**基本參考大話資料結構,其中鏈式結構大話上也有,這裡沒有列出,也較簡單。
這裡的基本操作如下:
int initstack(sqstack *);
int push(sqstack *,int );
int pop(sqstack *,int *);
int gettop(sqstack *,int *);
int length(sqstack *);
int empty(sqstack *);
具體實現的**如下:
#include #include #define maxsize 100
struct sqstack;
int initstack(sqstack *s)
int push(sqstack *s,int e)
s->data[++s->top]=e;
return 1;
}int pop(sqstack *s,int *e)
*e=s->data[s->top--];
return 1;
}int gettop(sqstack *s,int *e)
*e=s->data[s->top];
return 1;
}int length(sqstack *s)
int empty(sqstack *s)
int main()
大話還介紹了兩棧共享空間,適用情況是乙個棧在增長,乙個棧在縮短,否則都增長棧很快就滿了溢位,就是有兩個指標top1和top2指向棧1和棧2,棧1的top1初始值是-1,棧2的初始值是n,棧空的條件就是和初始值的判斷,考察的重點一般是棧滿的條件,我原來一直以為棧滿的條件就是top1+top2==n,當然這是錯的,這種從top1出發的角度看是對的,但是如果從top2出發看的話,就錯的非常明顯了,如果top1只有乙個元素,那麼top1=0,top2有n-1個元素top2=1,此時棧1或者棧2再來乙個元素就棧滿了,所以條件應該是top1+1==top2。
未完待續: 下一節 棧和佇列演算法二之棧的應用
如果文章有什麼錯誤或者有什麼建議,歡迎提出,大家共同交流,一起進步
棧和佇列的基本操作
看歐立奇的 程式設計師面試寶典 的棧和佇列的部分,發現了部分問題。其中棧的部分,不能簡單的用malloc函式來初始化stack,應該呼叫create 函式 而且棧的base應該指向棧的最下面的資料的下乙個位址。全部除錯通過 棧的部分通過單鏈表來實現鏈棧的結構 include using namesp...
棧和佇列的基本操作
一種特殊的的線性表,只允許在固定的一端進行插入和刪除操作。棧被稱作是先進後出的線性表。只允許在一端進行插入資料操作,在另一端刪除資料操作的特殊線性表。具有先進先出的特性。迴圈佇列 簡單了解 隊空 rear front 隊滿 rear 1 maxsize front 初始化 銷毀 增 刪 查 type...
棧和佇列的基本操作
資料結構 棧和佇列的基本操作 棧的基本操作 include include define true 1 define false 0 define ok 1 define error 1 define overflow 2 define stack init size 100 define stac...