【c++】模拟实现顺序队列方法一

这是模拟实现顺序队列的第一种方法。

就是入队时队尾在不断后移,直到满,出队时队头不断后移,直到空。


如下如示例:






代码以及简单测试:

#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.测试拷贝和赋值运算



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值