数据结构02—队列的顺序存储(循环队列c++)

本文详细介绍了队列数据结构的基本概念,包括FIFO原则,以及如何在实际应用中使用普通队列和循环队列。特别关注了入队和出队操作的实现,以及如何避免内存溢出问题。

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

队列的概念:

队列是一种数据结构,它遵循先进先出(First-In-First-Out,FIFO)的原则。在队列中,新元素被添加到队列的末尾,并从队列的开头删除元素。

可以将队列类比为现实生活中排队等候的过程。例如,当你在超市排队结账时,先来的人先被服务,后来的人要等待前面的人完成结账才能轮到自己。

队列具有两个基本操作:入队(enqueue):1.将元素添加到队列的末尾。2.出队(dequeue):从队列的开头移除元素 

循环队列:

但是在现实社会中,大部分人使用队列并不是单纯的使用普通队列,使用普通队列存储数据会造成数据量过大,造成内存不足,这时我们就要引用循环队列了。循环队列是一种使用数组实现的队列数据结构,其特点是在队列的内部使用了循环的方式来管理元素。循环队列解决了顺序队列中出队操作导致队列前部空间浪费的问题。

结构:

      代码实现:

typedef struct   //定义队列的结点 
{
	Elemtype data[MAXSIZE];
	Elemtype front,rear;  //队头与队尾的索引 
}Queue;

其中front指针始终指向队头,而rear始终指向队尾。

入队:

在入队之前,我们最先要做的事就是先判断队列是否满了,防止出现内存溢出的情况,而判断是否为满可以通过(q.rear+1)%MAXSIZE==q.front,如果返回true说明需要进行出队操作了。

代码实现:

//入队 
void Push(Queue &q,int n)
{
	if((q.rear+1)%MAXSIZE==q.front)      //判断队列是否为满 
	{
		cout<<"队满了,请先出队!!"<<endl;
		return;
	}
	q.data[q.rear]=n;
	q.rear=(q.rear+1)%MAXSIZE;     //进队操作,队尾的移动规律,防止假溢出
	cout<<"入队成功!\n\n"; 
}

出队:

同理,在出队之前,我们最先要做的事就是先判断队列是否空了,防止出现无数据出的情况,而判断是否为满可以通过q.rear==q.front,如果返回true说明需要进行入队操作了。

代码实现:

void Pop(Queue &q)
{
	if(q.front==q.rear)
	{
		cout<<"队已空,请先入队!!"<<endl;   
		return;
	 } 
	 int e;
	 e=q.data[q.front];               //将出队的值赋予e       
	 q.front=(q.front+1)%MAXSIZE;     //出队操作,队头向后防止假溢出 
	 cout<<"出队的元素是:"<<e<<endl<<endl;
 } 

源码:

#include<iostream>
using namespace std;
#define MAXSIZE 5

typedef int Elemtype;

typedef struct   //定义队列的结点 
{
	Elemtype data[MAXSIZE];
	Elemtype front,rear;  //队头与队尾的索引 
}Queue;

void Initqueue(Queue &q)    //初始化   
{
q.front=q.rear=0;
 } 
//入队 
void Push(Queue &q,int n)
{
	if((q.rear+1)%MAXSIZE==q.front)      //判断队列是否为满 
	{
		cout<<"队满了,请先出队!!"<<endl;
		return;
	}
	q.data[q.rear]=n;
	q.rear=(q.rear+1)%MAXSIZE;     //进队操作,队尾的移动规律,防止假溢出
	cout<<"入队成功!\n\n"; 
}
//出队
void Pop(Queue &q)
{
	if(q.front==q.rear)
	{
		cout<<"队已空,请先入队!!"<<endl;   
		return;
	 } 
	 int e;
	 e=q.data[q.front];               //将出队的值赋予e       
	 q.front=(q.front+1)%MAXSIZE;     //出队操作,队头向后防止假溢出 
	 cout<<"出队的元素是:"<<e<<endl<<endl;
 } 
 
 void Getfront(Queue &q)
 {
 	int e;
 	e=q.data[q.front];                  //与上面同理 
 	cout<<"队头的值是:"<<e<<endl;
 }
 
 int main()
 {
 	Queue q;
 	int n;
    do
    {
    cout<<"\t1.初始化\n";
 	cout<<"\t2.入队\n";
 	cout<<"\t3.出队\n";
    cout<<"\t4.读取队头元素\n";
    cout<<"\t0.退出\n";
    cout<<"请选择:";
    cin>>n;
    	if(n==1)
    	{
    		Initqueue(q);
    		cout<<"初始化成功!\n\n";
		}
		if(n==2)
		{
			int d;
			cout<<"请输入入队元素:";
			cin>>d;
			Push(q,d);
		}
		if(n==3)
		{
			Pop(q);
		}
		if(n==4)
		{
			Getfront(q);
		}
	}while(n!=0);
 	return 0;
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值