1. 程式人生 > >【大話資料結構】04 棧與佇列 筆記

【大話資料結構】04 棧與佇列 筆記

《大話資料結構》 ——程傑 共463頁 筆記圈點主要內容,也請多多支援大話資料結構該書作者。

第 4 章 棧與佇列
111頁_定義 棧是限定在表尾進行插入和刪除操作的線性表。 佇列是隻允許在一端進行插入操作丶而在另一端進行刪除操作的線性表
棧的插入操作,叫做進棧、壓棧、入棧。 棧的刪除操作,叫做出棧、彈棧。 在一些彙編程式碼、記憶體分析中會有不同的叫法,所以需要記住。
ADT 棧(stack) Data 同線性表。元素具有相同的型別,相鄰的元素具有前驅和後繼關係。 Operation InistStack(*S):初始化操作,建立一個空棧S。 DestroyStack(*S):若棧存在,則銷燬它 ClearStack(*S)將棧清空 StackEmpty(S)若棧為空,返回true,否則返回false. GetTop(S,*e)若棧存在且非空,用e返回S的棧頂元素 Push(*S,e)若棧S存在,插入新元素e到S中併成為棧頂元素 Pop(*S,*e)刪除棧S中棧頂元素,並用e返回其值 StackLength(S)返回棧S的元素個數 endADT 棧是線性表的特例
棧的順序儲存結構
兩棧共享空間 通常當兩個棧的空間需求有相反關係時,一個增長時另一個棧在縮短的情況下
棧的鏈式儲存結構 棧鏈一般不需要頭結點
棧的鏈式儲存結構————進棧操作 Status Push(LinkStack *S,SElemType e) { LinkStackptr s=(LinkStackPtr)malloc(sizeof(StackNode)); s->data = e; s->next=S->top; //把當前的棧頂元素賦值給新結點的直接後繼 S->top=s; //將新的結點s賦值給棧頂指標 s->count++; return OK; }


棧的鏈式儲存結構————出棧操作 Status Pop(LinkStack *S,SElemType *e) { LinkStackptr p; if(StackEmpty(*s)) return ERROR; *e=s->top->data; p=S->top; //將棧頂結點賦值給P S->top=S->top->next; //使得棧頂指標下移一位,指向後一結點 free(p);//釋放結點p s->count--; return OK; }


如果棧的使用過程中元素變化不可預料,有時很小,有時非常大,那麼最好是用鏈棧,反之,如果它的變化在可控範圍內,建議使用順序棧會更好一些
126頁_遞迴 斐波那契數列
遞迴的定義: 把一個直接呼叫自己或通過一系列的呼叫語句間接地呼叫自己的函式,稱為遞迴函式 每個遞迴定義必須至少有一個條件,滿足時遞迴不再進行,即不再引用自身而是返回值退出 編譯器使用棧實現遞迴
迭代和遞迴區別: 迭代使用迴圈結構,遞迴使用選擇結構 遞迴程式碼整潔,但耗費大量時間和記憶體 迭代不需要反覆呼叫函式和佔用額外記憶體 //遞迴 int funcA(int n) { if(n>1) return n+funcA(n-1); else return 1; } //迭代 int funcB(int n) { int i,s=0; for(i=1;i<n;i++) s+=i; return s; }
棧的應用: 四則運算表示式求值 ——中綴表示式轉字尾表示式 ——字尾表示式(用來計算四則運算)

佇列的定義: 佇列是隻允許在一段進行插入操作,而在另一端進行刪除操作的線性表 佇列是一種先進先出的線性表,簡稱FIFO,允許插入的一端稱為隊尾,允許刪除的一端稱為隊頭
佇列的順序儲存結構: (1)引用front指標指向頭,rear指向下一位置,提高效率但產生了 假溢位
(2)引用了迴圈佇列解決假溢位,並設定一個標誌變數或者空一元素空間解決佇列滿與佇列空分辨
(3)引用佇列滿條件(rear-front+QueueSize)%QueueSize == front 解決佇列差一圈或是差一格區別

佇列的鏈式儲存結構: 其實就是線性表的單鏈表,只不過它只能尾進頭出而已,簡稱為鏈佇列。