顺序队列

本文介绍了顺序队列的基本概念,包括其作为先进先出FIFO结构的特点,以及如何处理队尾满和队空的情况。详细阐述了顺序队列的设计,特别是环形处理方式以及如何进行初始化、判空、判满、入队、获取队首元素、删除队首元素、获取有效长度、清空和销毁等基本操作。并提供了相关操作的代码实现。
摘要由CSDN通过智能技术生成

一、什么是队列?

  • 队列是一种先进先出FIFO的一种线性结构,也有链式和顺序之分。
  • 入队的一端称为队尾,出队的一端称为对头。

1.顺序队列的设计

在这里插入图片描述
这种设计就有一个问题,当队尾走到最后时,需要重新从对头插入数据。所以要将表当成环形处理。
在这里插入图片描述
当设计成环形时又出现了一个问题,队列的判空和判满不能用front==rear判断,所以书上规定,在队列中浪费一个空间用来标记,当rear+1和front相等时,表示队列满了。

typedef struct
{
   
	int* base;//指向动态内存开辟的空间;
	int front;//头指针,指向队列第一个元素的下标
	int rear;//尾指针,指向队尾元素的下一个位置;
}SqQueue,* PSqQueue;

2.顺序队列的基本操作

(1)初始化

void Init_Queue(PSqQueue sq)
{
   
	assert(sq != NULL);
	if (sq == NULL)return;
	sq->base = (int*)malloc(sizeof(int) * MAXQSIZE);//MAXQSIZE是用宏定义的默认值;
	if (sq->base == NULL)return;

	sq->front = 0;
	sq->rear = 0;
}

(2)判空

bool IsEmpty(PSqQueue sq)
{
   
	assert(sq != NULL);
	if (sq == NULL)return false;
	return sq->front == sq->rear;
}

(3)判满

有两种方法可以判满:

  1. 计数器原理,增加一个变量用来计数。
  2. 浪费一个空间用来标记,当rear+1=front时,队列满。

以下用第二种方法实现:

bool IsFull(PSqQueue sq)
{
   
	assert(sq != NULL);
	if (sq == NULL)return false;

	return (sq->rear + 1) % MAXQSIZE == sq->front;
}

(4)入队

bool Push(PSqQueue sq, int val)
{
   
	assert(sq != NULL);
	if (sq == NULL)return false;

	sq->base[sq->rear
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值