赞
踩
只允许对序列的两端进行操作,允许插入的一端称为队尾,允许删除的一端称为队头。
注意:在对队列进行入队、出队操作时,有可能会造成假溢出问题,如图(f)
解决方法有两个:
1.每次出队时,把所有元素往前移动
2.循环队列
但是循环队列无法通过条件Q.front==Q.rear来判断队列是空还是满,如图(b)和图(c)
解决方法:
1.设置一个标志域,来判断队列的状态
2.设置一个长度域,来判断队列的状态
3.少用一个元素空间,一旦Q.front==(Q.rear+1)%Q.maxsize,则认为队满,以下介绍这种解决方法的循环队列
#define OK 1
#define TRUE 1
#define FALSE 0
#define ERROR 0
#define OVERFLOW -1
typedef int Status;
typedef struct {
char * elem;
int head;//队头下标
int rear;//队尾下标
int maxsize;//最大容量
}SqQueue;
Status InitQueue_Sq(SqQueue *Q,int size){
Q->elem=(char *)malloc(size*sizeof(char));
if(Q->elem==NULL)return OVERFLOW;
Q->maxsize=size;//少用一个元素位置,如果size是6,则只有5个空间可以装元素
Q->head=Q->rear=0;
return OK;
}
Status DestroyQueue_Sq(SqQueue *Q){
free(Q->elem);
Q->elem=NULL;
Q->head=Q->rear=0;
return OK;
}
void ClearQueue_Sq(SqQueue *Q){
Q->head=Q->rear=0;
}
Status QueueEmpty_Sq(SqQueue Q){
if(Q.head==Q.rear){
printf("队列为空");
}else{
printf("队列不为空");
}
return OK;
}
int QueueLength_Sq(SqQueue Q){
return (Q.rear-Q.head+Q.maxsize)%Q.maxsize;
}
Status Gethead_Sq(SqQueue Q,char *e){
if(Q.head==Q.rear)return OVERFLOW;
*e=Q.elem[Q.head];
return OK;
}
Status EnQueue_Sq(SqQueue *Q,char e){
if((Q->rear+1)%Q->maxsize==Q->head){
printf("队满!入队失败");
return OVERFLOW;
}
Q->elem[Q->rear]=e;
Q->rear=(Q->rear+1)%Q->maxsize;
return OK;
}
Status DeQueue_Sq(SqQueue *Q,char *e){
if(Q->head==Q->rear){
printf("队空!出队失败");
return OVERFLOW;
}
*e=Q->elem[Q->head];
Q->head=(Q->head+1)%Q->maxsize;
return OK;
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。