3.4队列的定义和循环队列
循环队列的提出是为了解决假溢出现象:
队头指针+1:front = (front + 1) MOD MAXSIZE
队尾指针+1:rear = (rear + 1) MOD MAXSIZE
队空条件 front == rear
队满条件 (rear + 1 )MOD MAXSIZE == front
试探进队,若达到队头指针位置,则认为队满
进队操作:Q.data[Q.rear] = x;
Q.rear = (Q.rear + 1)%MaxSize;
出队操作:x = Q.data[Q.front];
Q.front = (Q.front + 1)%MaxSize;
#define MAXQSIZE 100 //最大队列长度+1
typedef struct
{
ElemType *base;//初始化的动态分配内存空间
int front;//头指针,若队列不空,指向队列头元素
int rear;//尾指针,若队列不空,指向队列尾元素的下一个位置
}SqQueue;
//初始化队列算法
void InitQueue(SqQueue & Q)
{
//构造一个空队列
Q.base = (QElemType *)malloc(MAXQSIZE * sizeof(QElemType));
if(!Q.base)//存储分配失败
exit(OVERFLOW);
Q.front = Q.rear = 0;//初始化为0
}
//销毁队列运算算法
void DestroyQueue(SqQueue &Q)
{
//销毁队列Q,Q不再存在
if(Q.base)
free(Q.base);
Q.base = NULL;
Q.front = Q.rear = 0;
}
//入队列算法
Status EnQueue(SqQueue &Q,QElemType e)
{
//插入元素e位Q的新的队尾元素
if((Q.rear + 1)%MAXSIZE == Q.front)//队列满
return ERROR;
Q.base[Q.rear] = e;
Q.rear = (Q.rear + 1) % MAXSIZE;
return OK;
}
//出队列算法
Status DeQueue(SqQueue &Q,QElemType &e)
{
//若队列不空,则删除Q的队头元素,用e返回其值
//并返回OK;否则返回ERROR
if(Q.front == Q.rear)//
return ERROR;
e = Q.base[Q.front];
Q.front = (Q.front + 1) % MAXSIZE;
return OK;
}
//取队头元素算法
Status GetHead(SqQueue Q,QElemType &e)
{
//若队列不空,则用e返回Q的队头元素,并返回OK
//否则返回ERROR
if(Q.front == Q.rear) //队列空
return ERROR;
e = Q.base[Q.front];
return OK;
}
//判断队空算法
Status QueueEmpty(SqQueue Q)
{
//若队列Q位空队列,则返回TRUE,否则返回FALSE
if(Q.front == Q.rear)//队列空的标志
return TRUE;
else
return FALSE;
}