数据结构—循环队列

目录

循环队列


循环队列

原则:先进先出

1、为了解决假溢出问题,将顺序队列变成一个环状的空间,称为循环队列

2、头尾指针以及队列元素之间的关系不变,只是再循环队列中,头尾指针以环状增1的操作可以用模运算来实现。通过取模,头尾指针可以在顺序表空间内以头尾衔接的方式循环移动。

3、当队列空间均被占满,此时头尾指针相同;

而当队列为空时,头尾指针也是相同的;

所以循环队列不能以头尾指针是否相同判别队列是满还是空

通常处理方式:

少用一个空间,即当队列空间大小m时,有m-1个元素就认为是队满。这样判断队空条件不变,当头尾指针的值相同时,则认为对空;而当尾指针在循环意义上加1等于头指针时,认为队满

队空条件:q.front==q.rear

队满条件:(q.rear+1)%MAXSIZE==q.front

1、存储结构

#include<bits/stdc++.h>
using namespace std;
 
#define MAXSIZE 110  //顺序栈存储空间的初始分配量
#define OK 1    //成功标识
#define ERROR 0 //失败标识
 
typedef int Status;	//Status是函数的类型,其值是函数结果状态代码,如OK等
 
typedef struct
{
    int *base;//存储空间的基地址 
    int front;//头指针 
    int rear;//尾指针 
}Sqqueue;

2、初始化

//初始化
Status init(Sqqueue &q)
{
	q.base =new int[MAXSIZE];//为顺序栈分配空间
	if(!q.base ) exit(0);//存储失败 
	q.front =q.rear =0;//将头指针和尾指针置0,队列为空 
	return OK;	 
} 

3、求队列长度

//球队列长度
int len(Sqqueue q) 
{
	return (q.rear -q.front +MAXSIZE)%MAXSIZE;
}

4、入队

//入队 
Status Push(Sqqueue &q,int e)
{
	if((q.rear+1 )%MAXSIZE==q.front  )//队满 
		return ERROR;
	q.base [q.rear ]=e;//新元素插入队尾 
	q.rear =(q.rear +1)%MAXSIZE;//队尾指针加1 
	return OK; 
} 

5、出队

//出队 
Status Pop(Sqqueue &q,int &e)
{
	if(q.front ==q.rear  )//队空 
		return ERROR;
	e=q.base [q.front ] ;//保存对头元素 
	q.front =(q.front +1)%MAXSIZE;//对头指针加一 
	return OK; 
} 

6.取队头元素

//取对头元素
int Get(Sqqueue q)
{
	if(q.front !=q.rear  )//队列非空 
		return q.base [q.front ];//返回
} 

7、输出队列中元素

Status Put(Sqqueue q)
{
	cout<<"队列中元素:";
	int i=0;
	while(q.front+i !=q.rear  )//队列非空 
	{
		cout<<q.base [q.front+i ]<<' ';
		i++;
	}
	cout<<endl;
	return OK;	 
}

8、主函数

int main()
{
	Sqqueue q;
	init(q);
	int n,k,e[100];
	cout<<"请输入你要入队元素个数:";
	cin>>n;
	cout<<"请输入你要入队元素:";
	for(int i=0;i<n;i++)
	{
		cin>>e[i];
		Push(q,e[i]);
	}
	Put(q);
	cout<<"对头元素:";
	Pop(q,k); 
	Put(q);
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值