資料結構複習三 棧和佇列

2021-10-01 22:05:49 字數 2315 閱讀 9270

先簡要介紹以下棧與佇列

棧(stack)是一種後進先出(lifo)的線性表,僅在表尾(即棧頂)進行插入或刪除操作,像火車排程的頭進尾出。

佇列(queue)與棧相反,是一種先進先出(fifo)的線性表,只允許在一端進行插入,而在另一端進行刪除,允許插入的一端稱為隊尾,允許刪除的一端則稱為隊頭,就像日常生活中的排隊。

基於已學的知識,我們可以利用順序儲存結構和鏈式儲存結構兩種儲存結構來實現棧,分別叫做順序棧、鏈棧。

順序棧的資料域主要包括棧頂、棧底指標top、base以及棧的最大容量stacksize,涉及順序空間上的增刪找改等操作,要注意棧頂指標的正確移動;進行資料出棧操作時,資料並沒有被刪除,而是留在原來的空間,等下一次入棧操作時被覆蓋。

具體演算法實現略

下面主要看鏈棧:

儲存結構:

typedef

struct stacknodestacknode,

*linkstack;

由於棧的主要操作是在棧頂進行插入和刪除,顯然以鍊錶頭部作為棧頂是最方便的,而且沒必要像單鏈表一樣為了操作方便附加乙個頭結點。

1、初始化

構造乙個空棧,因為沒有頭結點,直接棧頂指標置空即可

2、入棧

演算法步驟:

1、為入棧元素e分配空間,用指標p指向

2、將新結點資料域置為e

3、將新結點插入棧頂

4、修改棧頂指標為p

**實現:

void

push

(linkstack &s,

int e)

相當於把前面的元素都往棧裡壓

3、出棧

演算法步驟:

1、判斷是否棧空

2、將棧頂元素賦給e(不需要返回時可省略此步)

3、臨時儲存棧頂元素的空間,以備釋放

4、修改棧頂指標,指向新的棧頂元素

5、釋放原棧頂元素的空間

**實現:

void

pop(linkstack &s)

linkstack p=s;

s=s-

>next;

delete p;

}

這個比較好理解

4、取棧頂元素

直接返回棧頂指標s資料域,注意判斷棧空

佇列也有順序和鏈式兩種儲存表示

儲存結構是基位址base以及頭尾指標front和rear(假裝是指標,其實用作陣列下標)

初始front=rear=0

進隊rear++

出隊front–

front始終指向佇列頭元素,rear始終指向隊尾元素的下乙個位置

頭尾指標相同時隊空

由於這種操作會造成「假溢位」(空間未佔滿,但rear已至base尾部,新元素無法入隊)的問題,所以更提倡迴圈佇列;用模運算來解決新增元素位置的問題。

如何區別迴圈佇列滿還是空?

1、犧牲乙個元素空間,即佇列空間大小為m時,有m-1個元素就認為隊滿,這樣頭尾指標相同時隊空,而尾指標在迴圈意義上加1後等於頭指標,則認為隊滿

此時隊空條件:q.front==q.rear;

隊滿條件:(q.rear+1)%maxqsize=q.front

2、另設標誌位區分隊空還是隊滿

迴圈佇列**實現注意事項:

1、初始分配空間注意留出空間分配失敗的出口

2、求長度時應使用(q.rear-q.front+maxqsize)%maxqsize,加上乙個maxqsize防止出現負數

儲存結構:

typedef

struct qnodeqnode,

*queueptr;

typedef

struct

linkqueue;

初始時隊頭front隊尾rear指向共同結點,指標域置為空,後續元素入隊後,rear始終指向隊尾元素,出隊時注意釋放原隊頭元素所佔空間。

資料結構複習(三)棧和佇列(佇列)

是只允許在一端進入,在另一端刪除的線性表。插入 入隊,在隊尾插入,刪除 出隊,在隊頭刪除 定義 define maxsize 10 typeof struct sqqueue 初始化判空條件front為隊頭,rear為隊尾void initqueue sqqueue q 入隊bool enqueue...

複習 資料結構 棧和佇列

鏈佇列 include include define elemtype char define maxsize 100 typedef struct node 定義節點型別 snode typedef struct lqueue void initqueue lqueue qu void enque...

資料結構複習 棧和佇列

棧是一種只能在一端進行插入或刪除操作的線性表 棧的最主要特點是後進先出 lifo n個不同的元素進棧,其出棧次序總數為 catalan number c 2n nn 1 frac n 1c2n n typedef elemtype int typedef struct 共享棧 如果要用到兩個相同型別...