算法与数据结构之循环队列

本文探讨了静态队列为何需要使用循环结构的原因,避免数组越界问题。同时,解释了如何判断循环队列的满与空状态,通常采用少用一个元素空间作为标志。文章还讨论了循环队列与链式队列的选择场景,并给出了循环队列出队和入队的算法演示。最后,介绍了循环队列的具体实现方法。

为什么静态队列必须是循环队列?

静态队列也就是用数组实现的队列,在非空队列中,头指针指向队头元素,尾指针指向队列尾元素的下一个位置,对于非循环队列来说,假设为队列分配的最大空间为6,当尾指针指向第7个元素的位置时,不可再继续插入新的队尾元素,否则会因数组越界而导致程序代码被破坏,而此时又不宜如顺序栈那样,进行存储再分配扩大数组空间。因为队列的实际可用空间并未占满,一个巧妙的方法是将顺序队列臆造为一个环状的空间,称为循环队列
在这里插入图片描述

如何判断循环队列空间是满还是空

可有两种方法:其一是另设一个标志位以区别队列是空还是满;其二是少用一个元素怒空间,约定以“队列透支很在队列为指着的下一位上作为呈满状态的标志”,常用的为第二种
在这里插入图片描述

什么时候用循环队列,什么时候用链式队列

如果用户的应用程序中设有循环队列,则必须为它设定一个最大队列长度;若用户无法估计所用队列的最大长度,则宜采用连队列

循环队列出队和入队算法演示

在这里插入图片描述在这里插入图片描述

循环队列的实现

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define MAX_QSIZE 5	//最大队列长度加一

//队列的顺序存储结构(循环队列)
typedef struct Queue
{
   
   
	int *base;	//初始化的动态分配存储空间
	int front;	//头指针,若队列不为空,指向队列头元素
	int rear;	//尾指针,若队列不为空,指向队列尾元素的下一个元素
}QUEUE,*PQUEUE;

void Init(PQUEUE pQ);	//构造一个空的循环队列
void Destroy(PQUEUE pQ);//销毁队列
void Clear(PQUEUE pQ);	//清空队列
bool Empty(PQUEUE pQ);	//判断队列是否为空
int Length(PQUEUE pQ);	//返回队列长度
bool GetHead(PQUEUE pQ,int *e);//用e保存队头元素
bool Enqueue(PQUEUE pQ,int val);//入队
bool 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值