队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表
满足先进先出
避免只有一个元素时,队头和队尾重合使处理变得麻烦,引入front指针指向队头元素,rear指针指向队尾元素的下一个位置,当front=rear时,为空队列
顺序存储不足,采用循环队列
当front=rear时,可能空可能满,所以
1、设置flag
2、保留一个元素空间
此时判断队列满的条件是:(rear+1) % Queuesize == front
rear和front的大小不定,所以计算队列长度的公式为(rear-front+queuesize)% queuesize
typedef struct
{
QElemType data[MAXSIZE];
int front; /* 头指针 */
int rear; /* 尾指针,若队列不空,指向队列尾元素的下一个位置 */
}SqQueue;
循环队列的初始化代码如下:
Status InitQueue(SqQueue *Q)
{
Q->front=0;
Q->rear=0;
return OK;
}
循环队列求队列长度:
int QueueLength(SqQueue Q)
{
return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;
}
循环队列判空
int IsEmpty(SqQueue *Q)
{
if (Q->front == Q->rear)
return TRUE;
return FALSE;
}
循环队列判满
int IsFull(SqQueue *Q)
{
if ((Q->rear + 1) % MAXSIZE == Q->front)
return TRUE;
return FALSE;
}
循环队列的入队
int EnQueue(SqQueue *Q, ElemType x)
{
if ((Q->rear + 1) % MAXSIZE == Q->front)
return FALSE;
Q->elem[Q->rear] = x; //向队尾插入一个元素
Q->rear = (Q->rear + 1) % MAXSIZE; //将rear向后移动一个位置
return TRUE;
}
出队
int DeQueue(SqQueue *Q, ElemType *e)
{
if (Q->front == Q->rear)
return ERROR;
*e = Q->elem[Q->front]; //将队首元素取出给e
Q->front = (Q->front + 1) % MAXSIZE; //移动front指针
return OK;
}
取队头元素
int GetFront(SqQueue *Q, ElemType *e)
{
if (Q->front == Q->rear)
return ERROR;
*e = Q->elem[Q->front];
return OK;
}
队列的链式存储
队头指针指向链队列的头节点,队尾指针指向终端节点
空队列时,front和rear都指向头节点