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

首先来看看什么是队列?

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

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

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


【数据结构】循环队列的顺序实现_第1张图片

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

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

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

【数据结构】循环队列的顺序实现_第2张图片

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

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
using namespace std;
template 
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 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;
}

【数据结构】循环队列的顺序实现_第3张图片

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

运行结果为:

【数据结构】循环队列的顺序实现_第4张图片

你可能感兴趣的:(【数据结构】循环队列的顺序实现)