您的位置:首页 > 理论基础 > 数据结构算法

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

2017-11-22 02:00 417 查看
首先来看看什么是队列?

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

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

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



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

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

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



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

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
;
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;
}


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

运行结果为:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: