队列
- 特点:FIFO,先入先出,插入删除在两段进行(入队出队)
- 操作:
- 生成。
- 判断未满
- 判断非空
- 入队
- 出队
数组实现
- 一个一维数组
- 记录头元素位置变量front
- 记录尾元素位置变量rear
- 开始时front和rear都是-1。
循环队列
- 使用求余实现循环
线性数组的问题:
- 在一个固定长度的数组内,先不断入队直到填满数组,再几次出队。此时rear指向最大位置,数组中仍然有空间,但是却无法再插入元素。
出现一个问题:
- 若用front=rear表示队列为空,队列满时也会出现front=rear的问题。
- 出现原因:我们用front和rear的距离来表示情况,距离一共有n种情况,而队列一共有n+1中情况(包括队列为空)。我们无法用n种表示方法来表示n+1种情况。
- 解决方法:
- 使用额外标记:Size或者tag域,size记录元素个数,tag记录最后一次操作。
- 仅使用n-1个数组空间
实现代码
- 此处采用front==rear表示非空
- 此处采用(rear+1)%maxsize==front表示已满,即队列只存储n-1个元素,rear+1对maxsize取余等于front时一个位置时队列已满。
初始化
- 建立队列结构体,包括一个头指针,尾指针,最大容量和一个指向数组首地址的指针。
typedef int Position;
struct QNode {
ElementType *Data; /* 存储元素的数组 */
Position Front, Rear; /* 队列的头、尾指针 */
int MaxSize; /* 队列最大容量 */
};
typedef struct QNode *Queue;
创建队列
- 创建指向队列指针
- 创建数组
- 初始化front和rear的值
- 初始化最大容量的值
Queue CreateQueue( int MaxSize )
{
Queue Q = (Queue)malloc(sizeof(struct QNode));
Q->Data = (ElementType *)malloc(MaxSize * sizeof(ElementType));
Q->Front = Q->Rear = 0;
Q->MaxSize = MaxSize;
return Q;
}
判断已满
- rear+1对maxsize取余等于front时一个位置时队列已满
bool IsFull( Queue Q )
{
return ((Q->Rear+1)%Q->MaxSize == Q->Front);
}
入队
bool AddQ( Queue Q, ElementType X )
{
if ( IsFull(Q) ) {
printf("队列满");
return false;
}
else {
Q->Rear = (Q->Rear+1)%Q->MaxSize;
Q->Data[Q->Rear] = X;
return true;
}
}
判断非空
bool IsEmpty( Queue Q )
{
return (Q->Front == Q->Rear);
}
出队
ElementType DeleteQ( Queue Q )
{
if ( IsEmpty(Q) ) {
printf("队列空");
return ERROR;
}
else {
Q->Front =(Q->Front+1)%Q->MaxSize;
return Q->Data[Q->Front];
}
}