由于顺序队列有“假溢出”的缺点,所以在应用中,运用更多的是循环队列来实现队列的顺序存储。
(由于引用传参数,所以源文件需要.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;
}