循环队列(C++)

队列:
特点有:
1.先进先出,即尾进头出(或相反)
2.两个下标,一个表示头一个表示尾
3.本质也还是数组

注意点
1.假溢出问题,如图所示,尾下标到顶不能再加,但下面还有储存位置
在这里插入图片描述
解决办法:
一:固定队头或队尾,出队或入队时移动元素,保证队头或队尾一直在底部或顶部
二:循环队列(本文采用的的方法)

循环队列带来的问题:
无论时队空还是队满,都会有front == rear ,
以及rear,front实现循环的具体方法

解决方案:
1.引入计数变量counter,当counter == maxsize的时候,表示满,counter == 0的时候表示空,缺点是出入队时要记得对counter进行处理
2.约定(rear+1)%maxsize == front(即约定只空一个位置的时候为队满),本文方法
3.加一个判断标志,例如标志变量flag=0,如果元素入队列导致rear==front,flag置1,元素出列导致 rear ==front 时,flag置0,所以后面当front == rear时,可以判断flag来判断是否满队
4.具体方法。当rear,front 下标到maxsize时,对它(%maxsize)就可以再从0开始,达到循环效果
在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
const int maxsize = 3;
class queuee
{
	int rear, front;
	int a[maxsize];
public:
	queuee()
	{
		rear = front = 0;
	}
	void enqueue(int x)
	{
		if (!is_full())
		{
			a[rear] = x;
			rear = (rear + 1) % (maxsize);
		}
		else
		{
			cout << "队伍满了,不能进队";
		}

	}
	int dequeue()
	{
		if (is_empty())
		{
			cout << "队伍为空,不能出队";
			exit(0);
		}
		else
		{
			int b = a[front];//提前保存值,return a[front-1]不一定对,因为是循环的
			front = (front + 1) % (maxsize);
			return b;
		}

	}
	bool is_full()
	{
		return (rear + 1) % (maxsize) == front;
	}
	bool is_empty()
	{
		return front == rear;
	}
};
int main()
{
	queuee a;
	int x, y = 2;

	while (y--)
	{
		cin >> x;
		a.enqueue(x);
	}
	cout << a.dequeue();
	cin >> x;
	a.enqueue(x);
	cout << a.dequeue();
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值