迴圈佇列的操作

2022-05-13 00:57:09 字數 2919 閱讀 5803

佇列和鍊錶、堆疊一樣都是一種線性結構。只不過佇列的操作限定在兩端,只能夠在隊頭和隊尾進行操作。它的特性是先進先出,在隊尾進隊頭出。

佇列的物理結構包括順序儲存結構和鏈式儲存結構,也就是我們常說的順序佇列和鏈式佇列。

這裡就說一下順序佇列,順序儲存結構要預先分配記憶體,最好能知道佇列的最大長度,在順序佇列中當隊頭指標front和隊尾指標rear指向同一位置的

時候,表示佇列是空的如下圖(a);當隊尾指標指向末尾的時候,佇列就滿了如下圖(d)。下面放一張圖來說明順序佇列

在圖(a)中是順序佇列的初始狀態,此時隊頭指標front和隊尾指標rear指向同一位置;然後就可以直接向隊中新增資料,入隊後rear指向下乙個位置,注意在新增

資料的時候front始終指向隊頭位置,新增後rear指向隊尾元素的下乙個位置,圖(b)就是新增了資料後的佇列;圖(c)是出隊後的狀態,每次出隊後,front就指向下一

個位置;在圖(d)中,隊尾指標rear已經指向了佇列的末尾位置,沒法再入佇列了,如果再入隊的話就會溢位,但實際上隊頭前面還有空的位置但又不能用,所以這樣

就造成了空間的浪費,這是一種假溢位。為了解決這個問題,就引入了迴圈佇列,迴圈佇列,放上來說明

第乙個圖是初始狀態,然後開始入隊,經過幾次入隊後,就到了第二個圖,在此過程中隊頭指標front始終指向隊頭元素,隊尾指標rear指向隊尾元素的下乙個位置,

這和上面的講的一樣。同樣的,當隊頭指標front和隊尾指標rear指向同一位置的時候,表示佇列是空的,那在第三個圖中就發現此時佇列是滿的,但是按照front=rear,

那麼佇列又是空的,這就矛盾了。所以這裡就留乙個位置不用,就是第二個圖的樣子,這時候通過 (q->rear+1)%size==q->front 這條語句來判斷佇列是否滿了;假如

現在要用的佇列長度是100,那就令size=101,多出來的乙個不用,以便用 (q->rear+1)%size==q->front 這個條件來判斷佇列滿了沒有。

講的不太詳細,多理解理解,拿筆去畫畫,試著演示一下,應該還是能明白的。下面就來展示一下迴圈佇列的各種操作,包括初始化、入隊、出隊等,**已經測

試過了,注釋我寫的也比較詳細了。如有不對的地方,歡迎指出錯誤!

1 #include2 #include3 #include

4 #include5

#define maxsize 101

6using

namespace

std;

7 typedef struct

8 cqueue; //

迴圈佇列

1213 cqueue* initqueue() //

初始化佇列

1421 q->front=0

;22 q->rear=0; //

空佇列的話隊頭和隊尾指向同一位置

23return

q;24}25

int push(cqueue *q,int e) //

入隊成功返回1,入隊失敗返回0

2633

int pop(cqueue *q,int *e) //

出隊成功返回1,出隊失敗返回0

3440 *e=q->data[q->front];

41 q->front=(q->front+1)%maxsize; //

隊頭元素出隊後,front指向下乙個位置

42return1;

43}44int length(cqueue *q)

4548

int isempty(cqueue *q) //

隊列為空返回1,非空返回0

4955

void clear(cqueue *q) //

清空56

59void printqueue(cqueue *q)

6068

while(i!=q->rear)

6974 printf("\n"

);75}76

intmain()

77while((ch=getchar())!='\n'

);87 printf("

隊中元素為:\n");

88printqueue(q);

89 printf("

佇列的長度為:%d\n

",length(q));

90for(int i=1;i<=5;i++)

9195 printf("

pop後佇列中的元素為:");

96printqueue(q);

97 printf("

pop後佇列的長度為:%d\n

",length(q));

98 printf("

結果為1表示隊列為空,為0表示佇列非空:%d\n

",isempty(q));

99clear(q);

100 printf("

結果為1表示隊列為空,為0表示佇列非空:%d\n

",isempty(q));

101return0;

102 }

結果如下:

迴圈佇列的操作

佇列是一種操作受限的線性表,特點是 先進先出 其限制在於允許在表的一端進行插入,稱之為隊尾 rear 新元素進隊稱為進隊 在表的另一端進行刪除隊頭 front 從佇列中刪除元素稱為出隊。而順序隊作為佇列的一種儲存方式,常被運用,但是為了解決順序佇列的 假溢位 現象 順序隊中,是引入兩個指標,且兩個指...

迴圈佇列操作

1.首先分配迴圈佇列的位址空間,用q表示,分配好頭指標 尾指標。int init queue q,m,rear,front,s int q int m int rear int front int s 2.往佇列中加入成員資料 用 s判斷佇列是否滿?如果不滿資料進佇列,尾指標移動乙個單位 void ...

迴圈佇列的基本操作

一 迴圈佇列的基本概念。佇列是線性表的一種,相對於棧的先進後出 filo 佇列是先進先出的 fifo 因此只能在一端輸入 隊尾rear 在另一端輸出 隊頭front 順序佇列的隊頭指向當前佇列第乙個元素的位置,隊尾指向當前元素的下乙個位置的下乙個位置,但是當隊滿時不能入棧,存在問題 設陣列長度為m,...