由於順序隊列有“假溢出”的缺點,所以在應用中,運用更多的是循環隊列來實現隊列的順序存儲。
(由於引用傳參數,所以源文件需要.cpp後綴,即c++文件存儲。)
循環隊列的判空條件爲:Q.rear == Q.fornt;
循環隊列的判讀隊滿的條件是:(Q.rear + 1) % MaxSize == Q.fornt;
下面是隊列實現的存儲類型結構體:
#define MaxSize 50
typedef int ElemType;
typedef struct {
ElemType data[MaxSize];
int fornt, rear;
}SqQueue;
下面是對隊列的一些基本操作:
void InitQueue(SqQueue &Q);
bool isEmpty(SqQueue &Q);
bool EnQueue(SqQueue &Q, ElemType e); //進隊
bool DeQueue(SqQueue &Q, ElemType &e); //出隊
bool GetHead(SqQueue Q, ElemType &e); //獲取頭元素
下面是一個測試主方法:
int main()
{
int s;
SqQueue sQueue;
InitQueue(sQueue);
scanf("%d", &s); //循環入隊列
while(s != 9999)
{
EnQueue(sQueue, s);
scanf("%d", &s);
}
GetHead(sQueue, s);
printf("隊頭元素爲:%d \n", s);
printf("隊所有元素爲:");
while(sQueue.rear != sQueue.fornt)
{
DeQueue(sQueue, s);
printf("%d ", s);
}
return 0;
}
運行結果如下:
完整的源程序如下:
#include "stdio.h"
#include "stdlib.h"
#define MaxSize 50
typedef int ElemType;
typedef struct {
ElemType data[MaxSize];
int fornt, rear;
}SqQueue;
void InitQueue(SqQueue &Q);
bool isEmpty(SqQueue &Q);
bool EnQueue(SqQueue &Q, ElemType e); //進隊
bool DeQueue(SqQueue &Q, ElemType &e); //出隊
bool GetHead(SqQueue Q, ElemType &e); //獲取頭元素
int main()
{
int s;
SqQueue sQueue;
InitQueue(sQueue);
scanf("%d", &s); //循環入隊列
while(s != 9999)
{
EnQueue(sQueue, s);
scanf("%d", &s);
}
GetHead(sQueue, s);
printf("隊頭元素爲:%d \n", s);
printf("隊所有元素爲:");
while(sQueue.rear != sQueue.fornt)
{
DeQueue(sQueue, s);
printf("%d ", s);
}
return 0;
}
void InitQueue(SqQueue &Q)
{
Q.rear = Q.fornt = 0;
}
bool isEmpty(SqQueue &Q)
{
if(Q.fornt == Q.rear) //此處爲循環隊列判空條件
return true;
else
return false;
}
bool EnQueue(SqQueue &Q, ElemType e)
{
if((Q.rear + 1) % MaxSize == Q.fornt)
return false;
Q.data[Q.rear] = e; //先賦值
Q.rear = (Q.rear + 1) % MaxSize; //再移動指針
return true;
}
bool DeQueue(SqQueue &Q, ElemType &e)
{
if(Q.fornt == Q.rear)
return false; //隊空情況
e = Q.data[Q.fornt];
Q.fornt = (Q.fornt + 1) % MaxSize;
return true;
}
bool GetHead(SqQueue Q, ElemType &e)
{
if(Q.fornt == Q.rear)
return false; //隊空情況
e = Q.data[Q.fornt];
return true;
}