数据结构:顺序表实现环形队列

本文深入探讨了队列的基本概念,包括其定义、特点及分类,并详细讲解了环形队列的实现原理与操作方法,如入队、出队等,通过代码示例帮助读者理解环形队列如何解决顺序队列存在的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、队列的定义:队列是一种特殊的线性表,线性表两端都可以进行插入删除,而队列只能在队头删除,队尾插入。插入元素称为入队,删除元素称为出队。

2、队列的特点:

(1)只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表  
(2)进行插入操作的一端称为队尾(入队列)  
(3)进行删除操作的一端称为队头(出队列)  
(4)队列具有先进先出(FIFO)的特性

3、队列的分类:顺序队列和环形队列

由于顺序队列在操作上有诸多不便,(出队列时,要进行元素的搬移,效率低下,还会出现假溢出的问题)在此我们可以创建循环的顺序队列,即环形队列。

4、环形队列的入队 :

5、环形队列的实现:

(1)squeue.h:

//顺序表实现环形队列
//环形的目的是为了提高出队的时间复杂度
//浪费一个单元不使用,是为了区分队满和队空

#define SIZE 10
typedef struct SQueue
{
    int elem[SIZE];
    int front;//队头指针,第一个元素的下标
    int rear;//队尾指针,最后一个元素的下一个下标,当前可以存放数据的下标
}SQueue,*PSQueue;

void InitQueue(PSQueue ps);

//入队
bool Push(PSQueue ps,int val);

//获取队头的值,但不删除
bool GetTop(PSQueue ps,int *rtval);

//获取队头的值,且删除
bool Pop(PSQueue ps,int *rtval);

//判断队空
bool IsEmpty(PSQueue ps);

(2)squeue.cpp:

#include "squeue.h"
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>

void InitQueue(PSQueue ps)
{
	assert(ps != NULL);
	if(ps == NULL)
	{
		return;
	}
	ps->front = 0;
	ps->rear = 0;
}

static bool IsFull(PSQueue ps)
{
	return (ps->rear+1)%SIZE == ps->front;
}

//入队
bool Push(PSQueue ps,int val)
{
	assert(ps != NULL);
	if(IsFull(ps))
	{
		return false;
	}
	ps->elem[ps->rear] = val;
	ps->rear = (ps->rear+1)%SIZE;
	return true;
}

//获取队头的值,但不删除
bool GetTop(PSQueue ps,int *rtval)
{
	assert(ps != NULL);
	if(IsEmpty(ps))
	{
		return false;
	}
	if(rtval != NULL)
	{
		*rtval = ps->elem[ps->front];
	}
	return true;
}

//获取队头的值,且删除
bool Pop(PSQueue ps,int *rtval)
{
	assert(ps != NULL);
	if(IsEmpty(ps))
	{
		return false;
	}
	if(rtval != NULL)
	{
		*rtval = ps->elem[ps->front];
		ps->front = (ps->front+1)%SIZE;
	}
	return true;
}

//判断队空
bool IsEmpty(PSQueue ps)
{
	return ps->front == ps->rear;
}

 

(3)main.cpp:

#include <stdio.h>
#include "squeue.h" 
int main()
{    
	SQueue ps;    
	InitQueue(&ps);     
	int tmp;     
	for(int i = 0; i < 20; i++)    
	{	
		Push(&ps, i);    
	}    
	
	while(!IsEmpty(&ps))    
	{	
		Pop(&ps, &tmp);	
		printf("%d\n",tmp);    
	}     
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值