【数据结构】循环队列的顺序实现

本文介绍了队列的基本概念及其实现方式,并详细探讨了循环队列的三种判断队满的方法,包括少用一个存储单元、设置标记以及使用计数器的方式。同时,通过示例代码展示了循环队列的具体实现。

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

首先来看看什么是队列?

队列是只允许在一端进行插入数据操作,在另一端进行删除数据操作 的特殊线性表。

通常情况下插入数据那一端叫做队尾,删除的那一端叫做对头,队列具有先进先出的特点。

队列一共有两种线性存储方式,一种是顺序的一种是链式的,顺序队列如图所示;



如果再加入两个元素就会出现假溢出现象。实际上还剩余两个空间,当顺序存储数据,有空间剩余的叫做假溢出,

如果所有空间都已经放满这时再放入数据才叫做真溢出。

为了解决假溢出的现象,便提出了循环队列的概念,当队列后面满了时再从头开始。


循环队列判断是否已满有三种方式:

1 少用一个存储单元
如果少用一个存储空间,则尾队尾指针加1等于队头指针为队列满的判断条件:(rear+1)%MaxSize==front队列空的条件仍旧为rear == front
2 设置一个标记为
设置标记为flag,初始时置flag = 0;每当入队列操作成功,就置flag=1;每当出队列成功就置flag=0.此时判断队列空 的条件为:rear == front && flag == 0;判断队列满的条件为rear == front&& flag == 1
3 设置一个计数器
设置计数器count,初始时置count=0,每当入队列操作成功,就是count加1,每当出队列成功,就使count减1。此时队列空的判断条件为:count==0;队列满的判断条件为count>0 && rear == front 或者count == MaxSize

代码如下:

#include<iostream>
using namespace std;
template <class T, int N =5 >
class Queue
{
public:
	Queue()
		:_front(0)
		, _back(0)
		, _count(0)
		
	{
		for (size_t i = 0; i < N; ++i)
		{
			_array[i] = 0;
		}
	}
	void push(const T& data)
	{
	
			
		
		_array[_back ++] = data;
		++_count;

		if (_count >= N)
		{
			_count = N;
		}
		if (_back == N)
		_back = 0;
			_back %= N;
		
		

	}
	void pop()
	{
		if (_count == 0)
			return;
		++_front;
		--_count;
		if (_front == N)
		{
			_front = 0;
		}

	}
	size_t size()const
	{
		return _count;
	}
	T &Front()
	{
		return _array[_front];
	}
	 const T &Front()const
	{
		 return _array[_front];
	}  
	 T Back()
	 {
		 return (_array[(_front + _count - 1) % N]);;
	 }
	const T Back()const
	 {
		return (_array[(_front + _count - 1) % N]) ;
	 }
	
private:
	T _array[N];
	int _front;
	int _back;
	int _count;

};
int main()
{
	Queue<int> q;

	q.push(1);
	q.push(2);
	q.push(3);
	q.push(4);
	q.push(5);
	q.push(6);
	q.push(7);

	cout << q.Back() << endl;
	cout << q.Front() << endl;
	q.pop();
	cout << q.Back() << endl;
	cout << q.Front() << endl;
	q.pop();
	cout << q.Back() << endl;
	cout << q.Front() << endl;
	q.pop();
	cout << q.Back() << endl;
	cout << q.Front() << endl;
	q.pop();
	cout << q.Back() << endl;
	cout << q.Front() << endl;

	system("pause");
	return 0;
}

在监视窗口可以看见,当元素插满之后又开始从对头进行插入

运行结果为:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值