1. 程式人生 > >資料結構棧和佇列、遞迴演算法

資料結構棧和佇列、遞迴演算法

知識要點:

棧的定義、結構特點及其儲存方式(順序儲存與連結儲存)和基本操作的實現演算法;

佇列的結構、特點及其儲存方式(順序儲存與連結儲存)和基本操作的實現演算法。

遞迴的基本概念和實現原理以及用遞迴的思想描述問題和書寫演算法的方法;

用棧實現遞迴問題的非遞迴解法。

棧的定義:只允許一段進行插入或者刪除操作的線性表;該端稱為棧頂(top),相反另一端不允許被操作的稱為棧底(base)

棧內元素的個數稱為棧的大小,不含任何元素的棧稱為空棧;

棧的特性:先進後出型(Last In First Out)

棧的儲存結構(順序存取利用一組連續的記憶體空間存取(預先開闢記憶體MaxSize)

1、順序棧初始化:S.top=-1;S.base=0;

2、入棧操作:S.data[++S.top] (棧不滿棧頂指標加一,資料入棧);

3、出棧操作:S.data[S.top],S.top-- (棧非空,取棧頂元素,棧頂指標減一);

4、棧空條件:S.top=-1;棧滿條件:S.top-S.base=MaxSize-1;(即S.top=MaxSize-1)

5、對於棧的操作:初始化、棧判空、入棧、出棧、取棧頂元素時間複雜度都為O(1);

棧的儲存結構(鏈式存取)利用指標標明資料元素之間的的邏輯關係(不用預先開闢記憶體)

1、鏈棧初始化:S=NULL;//預設為空棧

2、入棧操作:開闢一個新結點p

                        p->next=S;S=p;//修改棧頂指標

3、出棧操作:取棧頂元素;儲存當前棧頂指標p=S;棧頂指標後移S=S->next;清除原棧頂指標free(p);

3、棧空條件:S=NULL;棧滿條件:一般不會出現棧滿情況;

4、對於棧的操作:初始化、棧判空、入棧、出棧、取棧頂元素時間複雜度都為O(1);

補充(共享棧):兩端都為棧底,兩端的棧底指標分別為S.top1和S.top2;

初始化S.top1=-1以及S.top2=MaxSize+1

入棧操作:先++S.top1或--S.top2,之後進行入棧操作;

出棧操作:先取出資料,之後S.top1--或S.top2++;

棧滿操作:S.top2-S.top1=1;(此共享棧相當於一個數組兩個棧結構)

n個不同元素入棧得到的出棧序列的個數為:C(n ,2n)/(n+1);前者為組合數

棧的應用:遞迴呼叫、括號匹配、表示式求值(字首表示式、中綴表示式、字尾表示式)

佇列的定義:允許在表的兩端進行操作的線性表,一端進行入隊(插入),另一端進行出隊(刪除);允許插入的一端稱為隊尾

允許刪除的一端稱為隊頭;

佇列內元素個數的數量稱為佇列長度,不含任何元素的佇列稱之為空佇列;

佇列的特性:先進先出型(First In First Out)

佇列的儲存結構(順序存取迴圈佇列防止出現假溢位現象;預先開闢記憶體MaxSize

1、迴圈佇列的初始化:Q.front=Q.rear=0;

2、入隊操作:Q.rear=(Q.rear+1)%MaxSize;

3、出隊操作:Q.front=(Q.front+1)%MaxSize;

4、隊空條件:Q.front=Q.rear;隊滿條件:(Q.rear+1)%MaxSize=Q.front;

5、佇列的初始化、隊判空、入隊、出隊、求隊長(Q.rear-Q.front+MaxSize)%MaxSize時間複雜度都為O(1);

佇列的存處結構(鏈式存取

1、鏈式佇列的初始化:Q.front=Q.rear=new QNode;

                                      Q.front->next=NULL;//預設佇列為空

2、入隊操作:新建一結點p(隊首指標通常放在鏈隊的頭部

                       p->next=NULL,Q.rear->next=p;  //入隊    Q.rear=p;//修改隊尾指標

3、出隊操作:取出隊頭元素p=Q.front->next,e=p->data;隊頭指標後移Q.front=p->next;清除隊頭元素free(p)

                        如果被刪除的是最後一個元素(即刪除此元素佇列為空)則:Q.rear=Q.front;//修改隊尾指標

4、隊空條件:Q.front=Q.rear;

5、佇列的初始化、隊判空、入隊、出隊、求隊長時間複雜度都為O(1);

補充(雙端佇列):兩端均可以進行插入或者刪除操作的佇列;

佇列的應用:樹的層次遍歷以及圖的廣度遍歷、計算機內緩衝區的設定;