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