生活中有非常多隊列的影子,比方打飯排隊,買火車票排隊問題等,能夠說與時間相關的問題,一般都會涉及到隊列問題;從生活中,能夠抽象出隊列的概念,隊列就是一個能夠實現“先進先出”的存儲結構。隊列分為鏈式隊列和靜態隊列;靜態隊列一般用數組來實現,但此時的隊列必須是循環隊列,否則會造成巨大的內存浪費;鏈式隊列是用鏈表來實現隊列的。這里講的是循環隊列,首先我們必須明確以下幾個問題
一、循環隊列的基礎知識
1.循環隊列須要幾個參數來確定
循環隊列須要2個參數,front和rear
2.循環隊列各個參數的含義
(1)隊列初始化時,front和rear值都為零;
(2)當隊列不為空時,front指向隊列的第一個元素,rear指向隊列最后一個元素的下一個位置;
(3)當隊列為空時,front與rear的值相等,但不一定為零;
3.循環隊列入隊的偽算法
(1)把值存在rear所在的位置;
(2)rear=(rear+1)%maxsize ,當中maxsize代表數組的長度;
程序代碼:
bool Enqueue(PQUEUE Q, int val)
{
if(FullQueue(Q))
return false;
else
{
Q->pBase[Q->rear]=val;
Q->rear=(Q->rear+1)%Q->maxsize;
return true;
}
}
4.循環隊列出隊的偽算法
(1)先保存出隊的值;
(2)front=(front+1)%maxsize ,當中maxsize代表數組的長度;
程序代碼:
bool Dequeue(PQUEUE Q, int *val)
{
if(EmptyQueue(Q))
{
return false;
}
else
{
*val=Q->pBase[Q->front];
Q->front=(Q->front+1)%Q->maxsize;
return true;
}
}
5.怎樣推斷循環隊列是否為空
if(front==rear)
隊列空;
else
隊列不空;
bool EmptyQueue(PQUEUE Q)
{
if(Q->front==Q->rear) //推斷是否為空
return true;
else
return false;
}
6.怎樣推斷循環隊列是否為滿

這個問題比較復雜,如果數組的存數空間為7,此時已經存放1,a,5,7,22,90六個元素了,如果在往數組中加入一個元素,則rear=front;此時,隊列滿與隊列空的推斷條件front=rear同樣,這種話我們就不能推斷隊列究竟是空還是滿了;
解決問題有兩個辦法:一是添加一個參數,用來記錄數組中當前元素的個數;第二個辦法是,少用一個存儲空間,也就是數組的最后一個存數空間不用,當(rear+1)%maxsiz=front時,隊列滿;
bool FullQueue(PQUEUE Q)
{
if(Q->front==(Q->rear+1)%Q->maxsize) //推斷循環鏈表是否滿,留一個預留空間不用
return true;
else
return false;
}
queue.h文件代碼:
#ifndef __QUEUE_H_
#define __QUEUE_H_
typedef struct queue
{
int *pBase;
int front; //指向隊列第一個元素
int rear; //指向隊列最后一個元素的下一個元素
int maxsize; //循環隊列的最大存儲空間
}QUEUE,*PQUEUE;
void CreateQueue(PQUEUE Q,int maxsize);
void TraverseQueue(PQUEUE Q);
bool FullQueue(PQUEUE Q);
bool EmptyQueue(PQUEUE Q);
bool Enqueue(PQUEUE Q, int val);
bool Dequeue(PQUEUE Q, int *val);
#endif
queue.c文件代碼:
#include<stdio.h>
#include<stdlib.h>
#include"malloc.h"
#include"queue.h"
/***********************************************
Function: Create a empty stack;
************************************************/
void CreateQueue(PQUEUE Q,int maxsize)
{
Q->pBase=(int *)malloc(sizeof(int)*maxsize);
if(NULL==Q->pBase)
{
printf("Memory allocation failure");
exit(-1); //退出程序
}
Q->front=0; //初始化參數
Q->rear=0;
Q->maxsize=maxsize;
}
/***********************************************
Function: Print the stack element;
************************************************/
void TraverseQueue(PQUEUE Q)
{
int i=Q->front;
printf("隊中的元素是:\n");
while(i%Q->maxsize!=Q->rear)
{
printf("%d ",Q->pBase[i]);
i++;
}
printf("\n");
}
bool FullQueue(PQUEUE Q)
{
if(Q->front==(Q->rear+1)%Q->maxsize) //推斷循環鏈表是否滿,留一個預留空間不用
return true;
else
return false;
}
bool EmptyQueue(PQUEUE Q)
{
if(Q->front==Q->rear) //推斷是否為空
return true;
else
return false;
}
bool Enqueue(PQUEUE Q, int val)
{
if(FullQueue(Q))
return false;
else
{
Q->pBase[Q->rear]=val;
Q->rear=(Q->rear+1)%Q->maxsize;
return true;
}
}
bool Dequeue(PQUEUE Q, int *val)
{
if(EmptyQueue(Q))
{
return false;
}
else
{
*val=Q->pBase[Q->front];
Q->front=(Q->front+1)%Q->maxsize;
return true;
}
}
