【队列】定长顺序循环队列

队列是一种先进先出的顺序表,在一端(队尾rear)插入,另一端(队头front)删除。

为了节省空间,顺序队列采用循环的方式存储数据(可以把它想象成一个环)。

队列为空时rear和front指向同一下标,队列满时也会指向同一位置。为了区分这两种情况,有两种处理方法:

1.人为的将队列空出一格不存数据,空队列rear==front,满队列(rear+1)%QueueSize==front

2.设置一个flag标志队列为空或满

本文采用方法一

定义循环队列

类似这样

typedef int QElemType;

#define MAXSIZE 10

typedef struct//不支持扩容
{
	QElemType* base;//指向“数组”
	int front;//队头,第一个数据的下标
	int rear;//队尾,当前可以存放数据的下标
}SqQueue, * PSqQueue;

 初始化

void InitQueue(PSqQueue pq)
{
	assert(pq != NULL);
	pq->base = (QElemType*)malloc(MAXSIZE * sizeof(QElemType));
	assert(pq->base != NULL);
	if (pq->base == NULL)
	{
		perror("InitQueue");
		return;
	}
    //初始头尾下标都为0
	pq->front = 0;
	pq->rear = 0;
}

获得有效数据个数

int GetLength(PSqQueue pq)
{
	assert(pq != NULL);
	if (pq == NULL)
		return -1;
	int len = (pq->rear - pq->front + MAXSIZE) % MAXSIZE;
	return len;
}

判空

front和rear指向同一位置

bool IsEmpty(PSqQueue pq)
{
	return pq->front == pq->rear;
}

判满

队尾再往后走一步就是头

static bool IsFull(PSqQueue pq)
{
	return (pq->rear + 1) % MAXSIZE == pq->front;
}

入队

bool Push(PSqQueue pq, QElemType val)
{
	if (IsFull(pq))//判断是否可以入
		return false;
	pq->base[pq->rear] = val;//rear指向的是能放数据的地方
	pq->rear = (pq->rear + 1) % MAXSIZE;//更新rear
	return true;
}

出队

bool类型判断是否出队成功,必须传参把队头值带出去

bool Pop(PSqQueue pq, QElemType* rtval)
{
	if (IsEmpty(pq))//判断能否出队
		return false;
	*rtval = pq->base[pq->front];
	pq->front = (pq->front + 1) % MAXSIZE;
	return true;
}

获取对头值,不删除

bool GetHead(PSqQueue pq, QElemType* rtval)
{
	if (IsEmpty(pq))
		return false;
	*rtval = pq->base[pq->front];
	return true;
}

清空数据

头和尾指向一处就为空

void Clear(PSqQueue pq)
{
	pq->front = pq->rear = 0;
}

销毁内存

free掉初始化时malloc的base空间,并且指向NULL(防止多次销毁)

void Destroy(PSqQueue pq)
{
	free(pq->base);
	pq->base = NULL;
	pq->front = pq->rear = 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
循环顺序队列是一种基于数组实现的队列,它的出队和入队操作可以实现O(1)的时间复杂度,因此在实际应用中被广泛使用。下面介绍循环顺序队列的初始化、求长度、入队和出队算法。 1. 循环顺序队列的初始化 循环顺序队列的初始化需要以下步骤: (1)定义一个数组,具体大小根据实际需求而定。 (2)定义指向队头和队尾的指针,初始时它们均指向数组的第一个元素。 (3)将队头和队尾指针初始化为-1。 2. 求循环顺序队列的长度 循环顺序队列的长度定义为队列中元素的个数,可以通过队尾指针和队头指针之间的距离来计算。具体算法如下: ``` int length = (rear - front + maxSize) % maxSize; ``` 其中,maxSize是队列的最大容量。 3. 循环顺序队列的入队算法 循环顺序队列的入队算法需要以下步骤: (1)判断队列是否已满,如果已满则返回错误。 (2)将新元素插入到队尾指针所指向的位置。 (3)将队尾指针后移一位,如果已经到达数组的末尾,则将其指向数组的第一个元素。 4. 循环顺序队列的出队算法 循环顺序队列的出队算法需要以下步骤: (1)判断队列是否为空,如果为空则返回错误。 (2)取出队头指针所指向的元素。 (3)将队头指针后移一位,如果已经到达数组的末尾,则将其指向数组的第一个元素。 需要注意的是,循环顺序队列的队头指针和队尾指针是循环的,因此在计算它们的位置时需要进行取模运算。同时,队列为空和队列已满的判断也需要特别注意。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

曦樂~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值