#define maxsize 10
typedef struct{
elemtype data[maxsize];
int front,rear; //对头指针和队尾指针
}sqQueue;
//初始化
void InitQueue(sqQueue &Q){
Q.rear=Q.front=0;
}
//判空
bool QueueEmpty(sqQueue Q){
if(Q.rear==Q.front) return true;
else
return false;
}
//入队
bool EnQueue(sqQueue &Q,int x){
if(满) return false;//队尾指针的再下一个位置是对头 即(Q.rear+1)%maxsize==Q.front
Q.data[Q.rear]=x;
Q.rear=(Q.rear+1)%maxsize;
return true;
}
//出队
bool DeQueue(sqQueue &Q,int &x){
if(Q.rear==Q.front) return false; //判空
x=Q.data[Q.front];
Q.front=(Q.front+1)%maxsize;//后移
return true;
}
//获取队头元素的值
bool GetHead(sqQueue Q,int x){
if(Q.rear==Q.front) return false;
x=Q.data[Q.front];
return true;
}
//此时的rear都是指向队尾元素的后一个位置即下一个即将插入的位置
方案一:
//队列元素个数
(rear+maxsize-front)%maxsize
队列已满条件:队尾指针的再下一个位置是队头,即 (Q.rear+1)%Maxsize=Q.front
此时会浪费一个存储单元
方案二:
在结构体中定义int size=0,//队列当前长度
每次插入成功size++ 删除成功size--,
队满时size=maxsize
方案三:
定义int tag;//最近进行的是插入or删除
tag=0最近进行删除操作,=1为插入,
只有删除操作才可能导致队空,只有插入操作才可能导致队满
队满时 front==rear&&tag=1
队空 front==rear&&tag=0
//若rear指向队尾元素 则
入队操作:Q.rear=(Q.rear+1)%Maxsize;Q.data[Q.rear]=x 先将rear指针后移再插入
初始化: front=0;rear=n-1
判空:(Q.rear+1)%Maxsize=Q.front (队尾指针的下一个位置是不是队头)