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