文章目录
一、学习总结
初始时:Q.front = Q.rear = 0
队首指针+1:Q.front = (Q.front + 1) % MAX_QSIZE;
队尾指针+1:Q.rear = (Q.rear + 1) % MAX_QSIZE;
队列长度:(Q.rear - Q.front + MAX_QSIZE)% MAX_QSIZE;
队满条件:(Q.rear + 1) % MAX_QSIZE == Q.front; **队头指针在队尾指针的下一位置作为队满的标志**
队空条件仍为:Q.front == Q.rear;
队中元素个数:(Q.rear - Q.front + MAX_QSIZE) % MAX_QSIZE;
二、基本操作
1.构造一个空队列Q
知识点
- 队列中的数据元素:①base ②front ③rear
- 为队列分配空间 (和销毁的区别)
- 为空时Q.rear = Q.front = 0;
代码
Status InitQueue(SqQueue &Q)
{ // 构造一个空队列Q
/********** Begin **********/
Q.base = new QElemType[MAX_QSIZE];
if (!Q.base) exit(OVERFLOW);
Q.front = Q.rear = 0;
return OK;
/********** End **********/
}
2.销毁队列Q,Q不再存在
知识点
- 注意与构造的区别
代码
Status DestroyQueue(SqQueue &Q)
{ // 销毁队列Q,Q不再存在
/********** Begin **********/
Q.front = Q.rear = 0;
return OK;
/********** End **********/
}
3.将Q清为空队列
知识点
- 与销毁操作相同
代码
Status ClearQueue(SqQueue &Q)
{ // 将Q清为空队列
/********** Begin **********/
Q.front = Q.rear = 0;
return OK;
/********** End **********/
}
4.若队列Q为空队列,则返回TRUE;否则返回FALSE
知识点
- 两个判别条件
代码
Status QueueEmpty(SqQueue Q)
{ // 若队列Q为空队列,则返回TRUE;否则返回FALSE
/********** Begin **********/
if (Q.front == Q.rear || Q.rear + 1 == Q.front) return TRUE;
else return FALSE;
/********** End **********/
}
5.返回Q的元素个数,即队列的长度
知识点
- 注意要加上队列长度后再模队列
代码
int QueueLength(SqQueue Q)
{ // 返回Q的元素个数,即队列的长度
/********** Begin **********/
return (Q.rear - Q.front + MAX_QSIZE) % MAX_QSIZE;
/********** End **********/
}
6.若队列不空,则用e返回Q的队头元素,并返回OK;否则返回ERROR
知识点
- 注意表示方法:Q.base[Q.front];
代码
Status GetHead(SqQueue Q,QElemType &e)
{ // 若队列不空,则用e返回Q的队头元素,并返回OK;否则返回ERROR
/********** Begin **********/
if (Q.rear == Q.front || Q.rear + 1 == Q.front) return ERROR;
e = Q.base[Q.front];
return OK;
/********** End **********/
}
7.插入元素e为Q的新的队尾元素
知识点
- 队头指针在队尾指针的下一位置作为队满的标志
代码
Status EnQueue(SqQueue &Q,QElemType e)
{ // 插入元素e为Q的新的队尾元素
/********** Begin **********/
if ((Q.rear + 1) % MAX_QSIZE == Q.front) return ERROR;
Q.base[Q.rear] = e;
Q.rear = (Q.rear + 1) % MAX_QSIZE;
/********** End **********/
}
8.若队列不空,则删除Q的队头元素,用e返回其值,并返回OK;否则返回ERROR
知识点
- 由于是循环队列,因此删除队头元素后Q.rear需前进1
代码
Status DeQueue(SqQueue &Q,QElemType &e)
{ // 若队列不空,则删除Q的队头元素,用e返回其值,并返回OK;否则返回ERROR
/********** Begin **********/
if (Q.front == Q.rear) return OK;
e = Q.base[Q.front];
Q.front = (Q.front + 1) % MAX_QSIZE;
return OK;
/********** End **********/
}
9.从队头到队尾依次对队列Q中每个元素调用函数vi()
知识点
我真的不明白这个
代码
Status QueueTraverse(SqQueue Q)
{ // 从队头到队尾依次对队列Q中每个元素调用函数vi()
/********** Begin **********/
int i = Q.front % MAX_QSIZE;
while (i != Q.rear % MAX_QSIZE) {
cout<<" "<<Q.base[i % MAX_QSIZE];
i = (i + 1) % MAX_QSIZE;
}
cout<<endl;
return OK;
/********** End **********/
}