队列只允许在队尾插入,在队头删除
循环队列防止假溢出现象
顺序存储结构用数组实现
#include <iostream>
using namespace std;
#define OK 1
#define ERROR 0
#define MAXSIZE 6
typedef int ElemType;
typedef int Status;
/* 定义顺序存储结构的循环队列:SqQueue(循环队列防止假溢出)
* 思路:
* 1、用数组实现
* 2、头指针front指向队头元素的下标
* 3、尾指针rear指向队尾元素下一个位置的下标
*/
typedef struct
{
ElemType data[MAXSIZE];
int front;
int rear;
}SqQueue;
/* 循环队列的初始化:InitQueue
* 思路:
* 1、头指针和尾指针指向的下标位置均为0
*/
Status InitQueue(SqQueue *Q)
{
Q->front = 0;
Q->rear = 0;
return 0;
}
/* 循环队列求队列长度:Queuelength
* 思路:
* 1、队列满的条件是:(rear+1)%MAXSIZE==front
* 2、规定:数组中只有一个空闲单元时3,规定已满
* 3、当rear>front时,长度为:rear-front,
* 4、当rear<front时,长度为:rear-front+MAXSIZE
* 5、将3和4结合:长度为:(rear-front+MAXSIZE)%MAXSIZE
*/
int Queuelength(SqQueue Q)
{
return (Q.rear - Q.front + MAXSIZE) % MAXSIZE;
}
/* 循环队列的入队,只在队尾入队:EnQueue,入队元素为e
* 思路:
* 1、判断队列是否已满,队列满的条件是:(rear+1)%MAXSIZE==front
* 2、在队尾的下一个元素入队,即data[rear]=e;
* 3、将尾指针后移一位i,若在最后择移动到数组头部,即:rear=(rear+1)%MAXSIZE
*/
Status EnQueue(SqQueue *Q, ElemType e)
{
if ((Q->rear + 1) % MAXSIZE == Q->front)
{
cout << "队列已满" << endl;
return ERROR;
}
Q->data[Q->rear] = e;
Q->rear = (Q->rear + 1) % MAXSIZE;
return OK;
}
/* 循环队列的出队:只在队头出队:DeQueue,返回元素为e
* 思路:
* 1、判断队列是否空,空的条件是front==rear
* 2、将队头元素返回e:e=data[front];
* 3、将头指针front后移一位,若到数组最后则移到数组头部,即:front=(front+1)%MAXSIZE
*/
Status DeQueue(SqQueue *Q, ElemType *e)
{
if (Q->rear == Q->front)
{
cout << "队列已空" << endl;
return ERROR;
}
*e = Q->data[Q->front];
Q->front = (Q->front + 1) % MAXSIZE;
return OK;
}
/* 输出队列函数:PrinftQueue
* 思路:
* 1、判断队列是否为空
* 2、由于数组中始终有一个空闲单元,所以front!=rear
* 3、当rear>front时,按下标从front到rear-1输出
* 4、当rear<front时,先输出front到MAXSIZE-1,再输出0到rear-1
*/
Status PrinftQueue(SqQueue *Q)
{
int i;
if (Q->rear == Q->front)
{
cout << "队列已空" << endl;
return ERROR;
}
if (Q->rear > Q->front)
{
for (i = Q->front; i < Q->rear; i++)
{
cout << Q->data[i] << ' ';
}
}
else
{
for (i = Q->front; i < MAXSIZE; i++)
{
cout << Q->data[i] << ' ';
}
for (i = 0; i < Q->rear ; i++)
{
cout << Q->data[i] << ' ';
}
}
return OK;
}
int main()
{
SqQueue Q;
InitQueue(&Q);
int i,j,k,l,m,n;
cout << "队列最大长度:" << MAXSIZE-1 << endl;
cout << "输入入队元素个数:";
cin >> i;
cout << "依次入队元素:";
for (j = 0; j < i; j++)
{
cin >> k;
EnQueue(&Q, k);
}
cout << "输出队列:";
PrinftQueue(&Q);
cout << endl;
int length;
cout << "输出队列长度:";
length = Queuelength(Q);
cout << length << endl;
cout << "输入出队元素个数:";
cin >> l;
cout << "输出出队元素:";
for (j = 0; j < l; j++)
{
DeQueue(&Q, &m);
cout << m << ' ';
}
cout << endl;
cout << "输出队列:";
PrinftQueue(&Q);
cout << endl;
cout << "输出队列长度:";
length = Queuelength(Q);
cout << length << endl;
cout << "输入入队元素个数:";
cin >> n;
cout << "依次入队元素:";
for (j = 0; j < n; j++)
{
cin >> k;
EnQueue(&Q, k);
}
cout << "输出队列:";
PrinftQueue(&Q);
cout << endl;
cout << "输出队列长度:";
length = Queuelength(Q);
cout << length << endl;
return 0;
}
结果为: