循环 队列不能再次增加空间,只能设置一个最大的长度。而对于无法估计长度的队列只能使用链式队列。
上图为线性循环队列,队列尾部指向队列最后一个元素的下一位,队列首部和尾部之间有一个空位置不放元素,用于区分队列满还是空。
#include<iostream>
using namespace std;
#define ElemType int
#define MAXSIZE 100
typedef struct queue
{
ElemType *base;
int front;
int rear;
}queue;
void init(queue &Q)
{
Q.base=(ElemType*)malloc(sizeof(ElemType)*MAXSIZE);
if(!Q.base)
{
cout<<"初始化分配空间失败"<<endl;
exit(-1);
}
Q.rear=Q.front=0;
}
//求队列长度
int len(queue &Q)
{
return(Q.rear-Q.front+MAXSIZE)%MAXSIZE;
}
//向队列尾部插入元素
int addElem(queue &Q,ElemType e)
{
if((Q.rear+1)%MAXSIZE==Q.front)
{
cout<<"队列已满"<<endl;
exit(-1);
}
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAXSIZE;
return 1;
}
//从 队列头部去掉一个元素
int remElem(queue &Q,ElemType &e)
{
if(Q.rear==Q.front)
{
cout<<"队列为空"<<endl;
exit(-1);
}
e=Q.base[Q.front];
Q.front=(Q.front+1)%MAXSIZE;
return 1;
}
//遍历队列
void print(queue &Q)
{
int index=Q.front;
for(int i=0;i<len(Q);i++)
{
cout<<Q.base[index++]<<endl;
}
}
void main()
{
queue Q;
ElemType e;
init(Q);
addElem(Q,1);
addElem(Q,2);
addElem(Q,3);
int l=len(Q);
cout<<"Q:"<<l<<endl;
print(Q);
cout<<"第一次遍历结束"<<endl;
remElem(Q,e);
print(Q);
system("pause");
}