心动C++情牵队列

/*------------------------------------------------------------------
 * Project: Queue.h
 * Name: zwp
 * Date: 2013.4
 *-------------------------------------------------------------------*/


#ifndef QUEUE_H_
#define QUEUE_H_

#include <iostream>

typedef int QueueType;

class Queue
{
private:
	class Node
	{
	public:
		QueueType data;  // 元素
		Node* next;

		Node(QueueType value, Node* link = 0)
		{
			data = value;
			next = link;
		}
	};
	typedef Node* NodePointer;

	NodePointer myFront; // 指向队列前段的指针
 	NodePointer myBack;  // 指向队列后端的指针

public:
	Queue();

	Queue(const Queue& queue); // 复制构造函数

	~Queue();

	const Queue& operator=(const Queue& queue); // 赋值函数

	bool empty(void)const;

	void enqueue(const QueueType value);

	QueueType front(void)const;

	void dequeue(void);

	friend std::ostream& operator<<(std::ostream& os, const Queue& queue);

};


#endif


 

/*----------------------------------------------------------------------
 * Project: Queue.cpp
 * Name: zwp
 * Date: 2013.4
 *----------------------------------------------------------------------*/


#include <iostream>
#include <new>
#include "Queue.h"

Queue::Queue()
	:myFront(0), myBack(0)
{ }

Queue::Queue(const Queue& queue)
{
	myFront = myBack = 0;
	if(!queue.empty())
	{
		myFront = myBack = new Queue::Node(queue.front()); // 复制第一个节点
		Queue::NodePointer ptr = queue.myFront->next;

		while(ptr != 0)
		{
			myBack->next = new Queue::Node(ptr->data); // 每次复制时动态内存分配节点
			myBack = myBack->next;
			ptr = ptr->next;
		}
	}
}

Queue::~Queue()
{
	if(empty())
	{
		myBack = myFront = 0;
	}
	else
	{
		Queue::NodePointer prev = myFront;
		Queue::NodePointer ptr = 0; // 初始化指针为空
		while(ptr != 0)
		{
			ptr = prev->next; // 指向下一个节点
			delete prev;
			prev = ptr;
		}
	}
}
		
const Queue& Queue::operator=(const Queue& queue)
{
	if(this != &queue) // 检查不是自赋值
	{
		this->~Queue(); // 销毁之前的节点
		if(queue.empty())
			myFront = myBack = 0; // 若要赋值的节点是一个空节点则将以前的节点置位空
		else
		{
			myFront = myBack = new Queue::Node(queue.front()); // 复制第一个节点
			Queue::NodePointer ptr = queue.myFront->next; // 指向下一个节点

			while(ptr != 0)
			{
				myBack->next = new Queue::Node(ptr->data); // 动态内存分配
				myBack = myBack->next;
				ptr = ptr->next;
			}
		}
	}
	return *this;
}


bool Queue::empty(void)const
{
	return (myFront == 0); 
}

QueueType Queue::front(void)const
{
	if(!empty())
		return myFront->data;
	else
		std::cerr <<"The Queue is empty..."<<std::endl;
}

void Queue::enqueue(QueueType value)
{
	Queue::NodePointer ptr = new Queue::Node(value);
	if(empty())
		myFront = myBack = ptr;
	else
	{
		myBack->next = ptr; // 队列尾指针指向新添加的节点
		myBack = ptr;  // 新添加的节点现在是尾指针
	}
}

void Queue::dequeue(void)
{
	if(!empty())
	{
		Queue::NodePointer ptr = myFront; // 指向队列首
		myFront = myFront->next; 
		delete ptr;

		if(myFront == 0) // 到达队列末尾后将队尾初始化为0
			myBack = 0;
	}
	else
		std::cerr <<"The Queue is empty...."<<std::endl;
}

std::ostream& operator<<(std::ostream& os, const Queue& queue)
{
	if(!queue.empty())
	{
		for(Queue::NodePointer ptr = queue.myFront; ptr != 0; ptr = ptr->next)
			os <<ptr->data<<"  ";
		return os;
	}
	else
		std::cerr <<"The Queue is empty...."<<std::endl;
}

			


	





/*-----------------------------------------------------------------------------------
 * Project: Test.cpp
 * Name: zwp
 * Date: 2013.4
 *----------------------------------------------------------------------------------*/


#include <iostream>
#include "Queue.h"


int main(void)
{
	Queue queue;

	for(int index = 0; index < 10; index ++)
		queue.enqueue(index*index);

	std::cout <<queue<<std::endl;

	system("pause");
	return 0;
}



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值