这是模拟实现顺序队列的第一种方法。
就是入队时队尾在不断后移,直到满,出队时队头不断后移,直到空。
如下如示例:
代码以及简单测试:
#include <cassert> // assert();
#include <iostream>
using namespace std;
// 头在不断变的顺序队列 (非循环队列)
template<typename T>
class Queue
{
public:
// 构造函数
Queue(const size_t capacity = 10)
:_rear(0)
,_front(0)
,_capacity(capacity)
{
_capacity = (_capacity >= 10) ? _capacity : 10; //最少分配十个元素的空间
_array = new T[_capacity];
}
// 拷贝构造
Queue(const Queue<T>& queue)
{
_Copying(queue);
}
// 赋值运算符重载
Queue<T>& operator=(const Queue<T>& queue)
{
if (this != &queue)
{
Queue tempQueue(queue);
_Copying(tempQueue);
}
return *this;
}
// 入队
void Push(const T&data)
{
assert(!Full());
_array[_rear++] = data;
}
// 出队
void Pop()
{
assert( !Empty() );
_front++;
}
// 队头
T& Front()
{
assert(!Empty());
return _array[_front];
}
const T& Front()const
{
assert(!Empty());
return _array[_front];
}
// 队尾
T& Back()
{
assert(!Empty());
return _array[_rear-1];
}
const T& Back()const
{
assert(!Empty());
return _array[_rear-1];
}
// 当前队列中元素个数
size_t Length()const
{
return _rear - _front;
}
// 析构函数
~Queue()
{
if (NULL != _array )
{
delete[] _array; _array = NULL;
_front = 0;
_rear = 0;
_capacity = 0;
}
}
// 判断是否满
bool Full()const
{
return _rear == _capacity;
}
// 判断是否为空
bool Empty()const
{
return 0 == _rear; _capacity;
}
private:
// 赋值和拷贝构造 调用
void _Copying(const Queue<T>& queue)
{
_array = new T[queue._capacity];
_rear = queue._rear;
_capacity = queue._capacity;
_front = queue._front;
for (size_t idx = _front; idx < _rear; ++idx )
{
_array[idx] = queue._array[idx];
}
}
private:
T* _array; // 指向数据的数组
size_t _rear; // 队尾
size_t _front; // 对头
size_t _capacity; // 队列容量
};
// 测试
void Test1()
{
// 测试基本操作
Queue<int> queue1;
queue1.Push(1);
cout << "插入一个元素后:" <<endl;
cout << "空否? " << queue1.Empty() << "长度? " << queue1.Length() << endl;
queue1.Push(2);
queue1.Push(3);
queue1.Push(4);
cout << "又入队三个元素后:" <<endl;
cout << "空否? " << queue1.Empty() << "长度? " << queue1.Length() << endl;
cout << "满否? " << queue1.Full() << "队头? " << queue1.Front() << "队尾?" << queue1.Back() <<endl;
queue1.Pop();
queue1.Pop();
cout <<"出队两个个后,队头?" << queue1.Front() << "队尾 " << queue1.Back() << endl;
// 测试拷贝构造和赋值运算符重载
// Queue<int> queue2;
// queue2.Push(1);
// queue2.Push(2);
// queue2.Push(3);
// queue2.Push(4);
// // Queue<int> que_copy_q2(queue2);
//
// Queue<int> que_copy_q2;
// que_copy_q2 = queue2;
// cout << "queue2 :"<< endl;
// cout << "队头:" << queue2.Front() << "队尾:" <<queue2.Back() << "空吗:" << boolalpha << queue2.Empty() << "长度:" << queue2.Length() <<endl;
// cout << "根据queue2 拷贝而来的队列:"<< endl;
// cout << "队头:" << que_copy_q2.Front() << "队尾:" <<que_copy_q2.Back() << "空吗:" << boolalpha << que_copy_q2.Empty()<< "长度:" << queue2.Length() <<endl;
}
int main()
{
Test1();
return 0;
}
1.测试基本操作
2.测试拷贝和赋值运算