#include<iostream>
#include<vector>
using namespace std;
typedef int DataType;
#define MaxSize 50
typedef struct { //循环队列的存储结构
DataType data[MaxSize];
int front,rear;
}SqQueue;
/*
循环队列的注意事项
公共的:
队列的初始状态:Q.front=Q.rear=0
入队操作:Q.data[Q.rear]=x;Q.rear=(Q.rear+1)%MaxSize;
出队操作:x=Q.data[Q.front];Q.front=(Q.front+1)%MaxSize;
1.循环队列的队列满和队列空的条件一样 所以要采取特殊方法区分
1.牺牲一个存储单元来区分队满和队空 常用
队满条件:(Q.rear+1)%MaxSize==Q.front
队空条件:Q.rear==Q.front;
2.类型中增设一个表示元素个数的数据成员
typedef struct{
DataType data[MaxSize];
int front,rear;
int size; //表示队列中数据元素个数
}
队满条件:Q.size==MaxSize;
队空条件:Q.size==0;
3.类型增设tag数据成员
typedef struct{
DataType data[MaxSize];
int front,rear;
int tag;
}
队满条件:tag==1;若因插入导致Q.rear==Q.front; 那麽表示队列为满
队空条件:tag==0;若因删除导致Q.rear==Q.front; 那麽表示队列为空
*/
//初始化循环队列
void InitQueue(SqQueue &Q){
Q.front=Q.rear=0;
}
//判队空
bool isEmpty(SqQueue &Q){
if(Q.front==Q.rear){
return true;
}else{
return false;
}
}
//入队
bool EnQueue(SqQueue &Q,DataType x){
if((Q.rear+1)%MaxSize==Q.front) //队满情况 用一个空间来区分队满和队空
{
cout<<"队列已满,无法入队!"<<endl;
return false;
}
else{
Q.data[Q.rear]=x; //入队
Q.rear=(Q.rear+1)%MaxSize; //修改队尾指针
return true;
}
}
//出队
bool DeQueue(SqQueue &Q,DataType &x){
if(Q.rear==Q.front){
cout<<"循环队列为空,无法进行出队操作!"<<endl;
return false;
}
else{
x=Q.data[Q.front];
Q.front=(Q.front+1)%MaxSize;
return true;
}
}
int main(){
SqQueue Q;
InitQueue(Q);
if(isEmpty(Q)){
cout<<"队列为空!"<<endl;
}else{
cout<<"队列非空!"<<endl;
}
EnQueue(Q,100);
EnQueue(Q,200);
DataType x;
DeQueue(Q,x);
cout<<x<<endl;
DeQueue(Q,x);
cout<<x<<endl;
if(isEmpty(Q)){
cout<<"队列为空!"<<endl;
}else{
cout<<"队列非空!"<<endl;
}
return 0;
}