迴圈佇列實現(C語言)

2021-07-24 02:52:39 字數 3221 閱讀 9213

背景:

生活中有很多佇列的影子,比如打飯排隊,買火車票排隊問題等,可以說與時間相關的問題,一般都會涉及到佇列問題;從生活中,可以抽象出佇列的概念,佇列就是乙個能夠實現「先進先出」的儲存結構。佇列分為鏈式佇列和靜態佇列;靜態佇列一般用陣列來實現,但此時的佇列必須是迴圈佇列,否則會造成巨大的記憶體浪費;鏈式佇列是用鍊錶來實現佇列的。這裡講的是迴圈佇列。

1、迴圈佇列

迴圈佇列的提出:為充分利用向量空間,克服

"假溢位"現象

方法:將向量空間想象為乙個首尾相接的圓環,並稱這種向量為迴圈向量。儲存在其中的佇列稱為迴圈佇列(

circular queue

)。儲存在其中的佇列稱為迴圈佇列(

circular queue

)實現方式

:這種迴圈佇列可以以

單鏈表的方式來在實際程式設計應用中來實現

特點:佇列的操作特點是

「先進先出

」。前者主要是頭指標、尾指標的使用,後者主要是理解迴圈佇列提出的原因及其特點。兩者都要掌握佇列空與滿的判定條件以及出佇列、入佇列操作的實現。

2、實現迴圈佇列的注意事項

迴圈佇列中,由於入隊時尾指標向前追趕頭指標;出隊時頭指標向前追趕尾指標,造成隊空和隊滿時頭尾指標均相等。因此,無法通過條件

front==rear

來判別佇列是"空

"還是"滿

"。解決這個問題的方法至少有兩種:

1)另設一

變數,用來記錄陣列中當前元素的個數,

以區別佇列的空和滿;

2)另一種方式就是資料結構常用的:

隊滿時:

(rear+1)%n==front,n

為佇列長度(所用

陣列大小),由於

rear

,front

均為所用空間的指標,迴圈只是邏輯上的迴圈,所以需要求餘運算。如圖a情況,隊已滿,但是

rear(5

)+1=6

!=front(0

),對空間長度求餘,作用就在此

6%6=0=front(0

)。(其二是少用乙個元素空間,也就是最後乙個儲存空間不用,如圖1,約定以

「佇列頭指標在佇列尾指標的下一位置(指環狀的下一位置)上

」作為佇列呈「滿

」狀態的標誌。

當(rear+1

)%maxsiz=front

時,佇列滿。)

圖a

圖1

圖2

3、原始碼

#ifndef __queue_h_  

#define __queue_h_

typedef int queueelementdatatype;

/////利用空乙個元素空間區分隊空還是隊滿

//typedef struct queue

queue,*pqueue;

void initialqueue(pqueue q,int queuemaxsize);

bool fullqueue(pqueue q);

bool emptyqueue(pqueue q);

bool enqueue(pqueue q, int val);

bool dequeue(pqueue q, int *val);

/////利用計數標誌區分隊空還是隊滿

//typedef struct queue2

queue2,*pqueue2;

void initialqueue2(pqueue2 q,int queuemaxsize);

bool fullqueue2(pqueue2 q);

bool emptyqueue2(pqueue2 q);

bool enqueue2(pqueue2 q, int val);

bool dequeue2(pqueue2 q, int *val);

#endif

#include "circulequeue.h"

#include //佇列初始化

void initialqueue(pqueue q,int queuemaxsize)

//入隊

bool enqueue(pqueue q, int val)

} //出隊

bool dequeue(pqueue q, int *val)

else

} //佇列判空

bool emptyqueue(pqueue q)

//佇列判滿

bool fullqueue(pqueue q)

void initialqueue2(pqueue2 q,int queuemaxsize)

bool emptyqueue2(pqueue2 q)

bool fullqueue2(pqueue2 q)

bool enqueue2(pqueue2 q, int val)

else }

bool dequeue2(pqueue2 q, int *val)

else }

int main()

for(int i = 0;i< q.queuemaxsize -2;i++)

//queue2 q2;

q2.queuemaxsize = 100;//佇列長度

initialqueue2(&q2,q2.queuemaxsize);//初始化佇列

for(int i = 0;i< q2.queuemaxsize -1;i++)//裝滿所有儲存空間

for(int i = 0;i< q2.queuemaxsize -1;i++)

return 0;

}

mysql迴圈佇列 C語言實現 迴圈佇列

include include include typedef struct queue int pbase 陣列 int front 頭 int rear 尾 rear不存放資料,所以rear前面的是最後乙個資料 queue void init queue queue pq bool full q...

迴圈佇列的實現(C語言)

迴圈佇列 vs2010 除錯 include include include define max size 6 define true 1 define false 0 define overflow 0 define ok 1 define error 0 typedef struct seq ...

C語言迴圈佇列的實現

迴圈佇列的操作包括初始化 求佇列的長度 入隊 出隊 取隊頭元素。下面是實現 在初始化之前,先進行預定義 define ok 1 define error 0 define overflow 2 define maxsize 100 typedef int status typedef int ele...