普通佇列,迴圈佇列以及鏈佇列的相關操作

2021-08-04 17:54:12 字數 2540 閱讀 5267

佇列,一種限定性的線性表。它只允許在表一端進行插入,而在表的另一端進行刪除操作。

基於此,我們定義了乙個資料結構,包含首尾指標

class

queue

置空佇列時 ,將rear=front=-1;

public

static queue initemptyqueue()

在不考慮隊列為空的情況下,出佇列頭指標front++,在不考慮溢位的情況下,進佇列尾指標rear++

public

static boolean inqueue(queue queue,object value)

public

static object outqueue(queue queue)

但是這樣會遇到問題,如下圖

當隊尾指標指向了陣列的最後乙個位置,而隊頭指標不在0號位置時,他會出現假溢位的現象,即陣列中有空位置,但是預設已經滿了。為了解決這一問題,我們引入了迴圈佇列,即將隊尾和對頭連線起來

迴圈佇列的資料結構還是和普通佇列一樣,只不過在設定空佇列時將,rear和front設為了max_size-1

class

cyclequeue

public

static cyclequeue initemptyqueue()

在進行判空的時候,只需要判斷front和rear是否相等

public

static

boolean

isempty(cyclequeue cyclequeue)

接下來就是佇列中最重要的兩個函式,出佇列和入佇列。出佇列的思想:當佇列不為空的時候,將佇列的第乙個元素出出佇列,用數學公式表達就是front=(front+1)%max_size,然後返回該位置;進佇列的思想是,先判斷front指標和rear指標是否直接相鄰,若是直接相鄰,則表示佇列已滿,無法插入,若不相鄰,則直接插入,插入的位置為:rear=(rear+1)%max_size.

public

static boolean inqueue(cyclequeue cyclequeue,object value)

public

static object outqueue(cyclequeue cyclequeue)

cyclequeue.front=(cyclequeue.front+1)%max_size;

return cyclequeue.data[cyclequeue.front];

}

為甚麼要使用練佇列呢?其實和鏈棧的思想是一致的,因為順序佇列總是需要分配固定的記憶體空間,若分配過大,容易造成空間浪費,若是分配過小,容易造成溢位,所以我們才使用了鏈佇列,在使用的過程中動態的分配空間。首先先看一下鏈佇列的資料結構

//將頭尾指標封裝在一起

class

linkqueue

//鏈佇列節點的型別

class

node

首先建立乙個帶頭結點的空佇列

public

static linkqueue initemptylinkqueue()

判斷佇列是否為空的思想和迴圈佇列相同,即判斷頭尾指標是否相等

public

static

boolean

isempty(linkqueue linkqueue)

最後看進佇列和出佇列兩個函式。進佇列的思想是:利用單鏈表尾插法的思想插入到鍊錶的尾部,具體可參考單鏈表的建立;出佇列的思想是:如果佇列不為空,則將對列的頭指標指向第乙個節點的下乙個節點,然後返回第乙個節點的值。

public

static boolean inqueue(linkqueue linkqueue,object value)

public

static object outqueue(linkqueue linkqueue)

node node=linkqueue.front.next;

linkqueue.front.next=node.next;

if(linkqueue.front.next==null)

linkqueue.rear=linkqueue.front;

return node.value;

}

至此。佇列的基本操作就完成了。

佇列(迴圈佇列 鏈佇列)

迴圈佇列 cirqueue.h 名稱 迴圈佇列 基於陣列 templateclass cirqueue q size 1 多申請乙個位置,保證隊滿 對空容易判定!cirqueue void enter datatype data 入隊操作 datatype shift 出隊操作 datatype g...

佇列 迴圈佇列與鏈佇列比較

對於迴圈佇列與鏈佇列的比較,可以從兩方面來考慮 1 從時間上,其實它們的基本操作都是常數時間,即都為0 1 的,不過迴圈佇列是事先申請好空間,使用期間不釋放,而對於鏈佇列,每次申請和釋放結點也會存在一些時間開銷,如果入隊出隊頻繁,則兩者還是有細微差異。2 對於空間上來說,迴圈佇列必須有乙個固定的長度...

佇列(單鏈佇列和迴圈佇列)

和線性表類似,佇列也有兩種儲存表示 鏈佇列 為操作方便,給鏈佇列新增乙個頭結點 佇列的鏈式儲存結構 typedef struct qnodeqnode,queueptr typedef struct linkqueue 1 include2 include3 include4 typedef str...