顺序队列的“溢出”问题
*真溢出
*假溢出
如何解决“假溢出”问题?
MAXQSIZE
修改入队
修改出队
循环队列
如何解决判决条件的二义性?
设置计数器count;设标志位tag;…;少用一个单元表示“满”.
满:Q.front=(Q.rear+1)%MAXQSIZE
空:Q.front=Q.rear
循环队列的模块说明:
#define MAXQSIZE 100
typedef struct{
QElemType *base;
int front;
int rear;
}SqQueue;
Status InitQueue(SqQueue &Q){
Q.base=(QEelemType *)malloc(MAXQSIZE * sizeof(QElemType));
if(!Q.base) exit(OVERFLOW);//存储分配失败
Q.front=Q.rear=0;
return OK;
}
Status EnQueue(SqQueue &Q,QElemType e){
if((Q.rear+1)%MAXQSIZE==Q.front) return ERROR;//队列满
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAXQSIZE;
return OK;
}
Status DeQueue(SqQueue &e,QElemType &e){
if(Q.front==Q.rear) return ERROR;
e=Q.base[Q.front];
Q.front=(Q.front+1)%MAXQSIZE;
return OK;
}
int QueueLength(SqQueue Q){
return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
}//if(Q.rear>=Q.front)
return (Q.rear-Q.front);
else
return(Q.rear-Q.front+MAXQSIZE);
Status QueueEmpty(SqQueue Q){
return (Q.front==Q.rear);
}//判队空
Status DestroyQueue(SqQueue &Q){
free(Q.base);
Q.base=NULL;
Q.front=Q.rear=0;
return OK;
}//销毁队列
双端队列,输入受限双端队列,输出受限双端队列