循环队列的基本操作:创建,初始化,求队长,出队,入队,取队头元素等。
#include<iostream>
#define MAXQSIZE 100
using namespace std;
typedef struct //定义队
{
int *base;
int _front;
int _rear;
}SqQueue;
int InitQueue(SqQueue &Q) //初始化队
{
Q.base=new int[MAXQSIZE];
if(!Q.base) return 0;
Q._front=Q._rear=0; //头指针和尾指针置为0,队列为空
return 1;
}
int QueueLength(SqQueue Q) //求队列的长度
{
return (Q._rear-Q._front+MAXQSIZE)%MAXQSIZE;
}
int EnQueue(SqQueue &Q,int e) //入队(入队,入栈都不需用引用传递)
{
if((Q._rear+1)%MAXQSIZE==Q._front) //判断是否队满
return 0;
Q.base[Q._rear]=e; //基地址加上偏移地址
Q._rear=(Q._rear+1)%MAXQSIZE; //队尾指针加1
return 1;
}
int DeQueue(SqQueue &Q,int &e) //删除队头元素,用e返回其值(出栈,出队都要用引用传递)
{
if(Q._front==Q._rear) return 0; //队空
e=Q.base[Q._front]; //保存队头元素
Q._front=(Q._front+1)%MAXQSIZE; //队头指针加1
return 1;
}
int GetHead(SqQueue Q) //取队头元素
{
if(Q._front!=Q._rear) //队列非空
return Q.base[Q._front]; //返回队头元素的值,队头指针不变
}
int main()
{
SqQueue Q;
InitQueue(Q);
cout<<"五元素入队: "<<endl;
for(int i=0;i<5;i++)
{
int j;
cin>>j;
EnQueue(Q,j);
}
cout<<"输出队列的长度:"<<endl;
cout<<QueueLength(Q)<<endl;
int k;
DeQueue(Q,k);
cout<<"出队1位:"<<endl;
cout<<k<<endl;
DeQueue(Q,k);
cout<<"再出队1位:"<<endl;
cout<<k<<endl;
cout<<"取队头元素:"<<endl;
cout<<GetHead(Q);
return 0;
}