数据结构之通过C++来实现一个队列

  闲来无事,随手写一个队列出来开心开心...我个人觉得这东西实在是挺简单的,也就没写什么注释,遇到问题的同学,请在评论框,留下你的疑问.

/*
*文件说明:Queue相关函数声明及实现(代码量较少,就不分文件实现了)
*作者:高小调
*日期:2016-12-07
*集成开发环境:Microsoft Visual Studio 2010 
*/
#ifndef __QUEUE_H__
#define __QUEUE_H__
template<typename T>
struct _QueueNode{
	_QueueNode *_pPrev;
	_QueueNode *_pNext;
	T _Data;
	//构造函数
	_QueueNode():_Data(T()){}	
	_QueueNode(const T & d)
		:_Data(d){}
};
template<typename T>
class Queue{
	typedef _QueueNode<T> Node;
public:
	//构造函数
	Queue()
		:_pHead(NULL)
		,_pTail(NULL)
		,_uSize(0){}
	//拷贝构造
	Queue(const Queue &q)
		:_pHead(NULL)
		,_pTail(NULL)
		,_uSize(0){
			//被拷贝对象不是空队列
			if(NULL != q._pHead){
				Node *pCur = q._pHead;
				while(pCur){
					PushBack(pCur->_Data);
					pCur = pCur->_pNext;
				}
			}
	}
	//赋值运算符重载
	Queue &operator=(const Queue& q){
		Queue tmp(q);
		swap(_pHead,tmp._pHead);
		swap(_pTail,tmp._pTail);
		swap(_uSize,tmp._uSize);
	}
	//析构函数
	~Queue(){
		if(NULL!=_pHead){
			Node *pCur = _pHead;
			while(pCur){
				delete pCur->_pPrev;
				pCur = pCur->_pNext;
			}
			_pHead = NULL;
			_pTail = NULL;
			_uSize = NULL;
		}
	}
public:
	//入队
	void PushBack(const T & e){
		//当前为空队列
		if(NULL==_pHead){
			_pHead = _pTail = _BuyNode(e);
		}else{
			Node *NewNode = _BuyNode(e);
			NewNode->_pPrev = _pTail;
			_pTail->_pNext = NewNode;
			_pTail = NewNode;
		}
		++_uSize;
	}
	//出队
	void PopFront(){
		//当前队列非空
		if(!Empty()){
			Node * DelNode = _pHead;
			Node * NewHead = _pHead->_pNext;
			if(NULL!=NewHead){
				NewHead->_pPrev = NULL;
			}
			_pHead = NewHead;
			delete DelNode;
			--_uSize;
		}
	}
	//判空
	bool Empty(){
		return _uSize==0;
	}
	//获取队首元素
	T &Front(){
		assert(_pHead);
		return _pHead->_Data;
	}
	const T &Front()const{
		assert(_pHead);
		return _pHead->_Data;
	}
	//获取队尾元素
	T &Back(){
		assert(_pTail);
		return _pTail->_Data;
	}
	const T &Back()const{
		assert(_pTail);
		return _pTail->_Data;
	}
	//获取当前队列元素个数
	size_t Size(){
		return _uSize;
	}
private:
	Node *_BuyNode(const T &e){
		return new Node(e);
	}
private:
	Node *_pHead;
	Node *_pTail;
	size_t _uSize;
};
#endif

 

/*
*文件说明:测试Queue类的基本接口
*作者:高小调
*日期:2016-12-07
*集成开发环境:Microsoft Visual Studio 2010 
*/
#include<assert.h>
#include<iostream>
#include"Queue.h"
using namespace std;
void QueueTest(){
	Queue<int> q1;
	q1.PopFront();
	q1.PushBack(1);
	cout<<"队首:"<<q1.Front()<<" 队尾:"<<q1.Back()<<endl;
	q1.PushBack(2);
	cout<<"队首:"<<q1.Front()<<" 队尾:"<<q1.Back()<<endl;
	q1.PushBack(3);
	cout<<"队首:"<<q1.Front()<<" 队尾:"<<q1.Back()<<endl;
	q1.PopFront();
	cout<<"队首:"<<q1.Front()<<" 队尾:"<<q1.Back()<<endl;
	q1.Front() = 666666;
	cout<<"队首:"<<q1.Front()<<" 队尾:"<<q1.Back()<<endl;
	q1.Back() = 999999;
	cout<<"队首:"<<q1.Front()<<" 队尾:"<<q1.Back()<<endl;
}
int main(){
	QueueTest();
	return 0;
}

  最基本的就是最精华的,当基础知识已经熟烂于心,不需要思考就可以敲出来时,我想要扩展其他的东西,就简单多了!!!

posted @ 2016-12-07 20:42  数据结构专题  阅读(222)  评论(0编辑  收藏  举报