循环队列
循环队列
循环队列不会产生假溢出。
当队列满时,还有一个空闲单元。
废话不多说,上代码。
循环队列的声明
#define MAX_SIZE 20
typedef int Type;
/*顺序存储结构*/
typedef struct sqQueue
{
Type data[MAX_SIZE];
int front; //头指针
int rear; //尾指针,若队列不空,指向队列尾元素的下一个
}sqQueue;
//1 创建一个空队列
sqQueue* queue_creat();
//2 入队列
bool queue_push(sqQueue* queue,Type val);
//3 出队列
Type queue_pop(sqQueue* queue);
//4 计算队列的长度
int queue_length(sqQueue* queue);
循环队列的实现
//1 创建一个空队列
sqQueue* queue_creat()
{
sqQueue* temp = (sqQueue*)malloc(sizeof(sqQueue));
if (temp == nullptr)
{
printf("创建队列失败");
}
temp->front = 0;
temp->rear = 0;
return temp;
}
//2 入队列
bool queue_push(sqQueue* queue,Type val)
{
if ((queue->rear + 1) % MAX_SIZE == queue->front)//队列判满条件
{
printf("队列已满,入队失败");
return false;
}
queue->data[queue->rear] = val;//将元素赋值给队尾
queue->rear = (queue->rear + 1) % MAX_SIZE;//rear指针往后移动一位,若已经指向队尾但队列没有满,则转到头部
return true;
}
//3 出队列
Type queue_pop(sqQueue* queue)
{
if (queue->front == queue->rear)//队空判断条件
{
printf("队列为空,出队失败");
return false;
}
Type val = queue->data[queue->front];//记录出队元素
queue->front = (queue->front + 1) % MAX_SIZE;//front指针往后移动一位,若已经指向队尾,则转到头部
return val;
}
//4 计算队列的长度
int queue_length(sqQueue* queue)
{
return (queue->rear - queue->front + MAX_SIZE) % MAX_SIZE;
}