实现一个循环队列模板类,并在main()函数里面测试。 70

实现一个循环队列模板类,并在main()函数里面测试。其成员函数包括:1.构造函数2.析构函数3.出队函数4.入队函数5.赋值运算符重载函数6.拷贝构造函数6.输出队列所... 实现一个循环队列模板类,并在main()函数里面测试。
其成员函数包括:
1.构造函数
2.析构函数
3.出队函数
4.入队函数
5.赋值运算符重载函数
6.拷贝构造函数
6.输出队列所有元素的函数(重载<<)
展开
 我来答
bladeLd
2013-01-11 · TA获得超过110个赞
知道答主
回答量:123
采纳率:100%
帮助的人:72.9万
展开全部
#pragma once
#include <iostream>

//声明模板,以便在Node中将Queue、operator<<声明为Node的特殊类型的友元
template<class Type> class Queue;
template<class Type> std::ostream& operator<< (std::ostream&, const Queue<Type>&);

//节点类
template<class T>
class Node
{
friend class Queue<T>;
friend std::ostream& operator<< <T> (std::ostream&, const Queue<T>&);
private:
Node(); //声明无参构造函数,不定义这个成员函数,可以禁止任何方式以无参形式创建Node对象
Node(const T &elem): m_element(elem),m_pNext(0){}
private:
T m_element; //队列每个元素保存数据的成员变量
Node *m_pNext; //后缀指针,指向队当前元素后面的下一个元素
};

//接口类
template<class Type>
class Queue
{
//输出操作符重载友元声明
friend std::ostream& operator<< <Type> (std::ostream&, const Queue<Type>&);
public:
Queue(): prear(0){}
public:
template<class It> Queue(It beg, It end): prear(0)
{ copy_elems(beg, end); }
//复制控制(拷贝构造函数、赋值操作符、析构函数)
Queue(const Queue &q): prear(0)
{ copy_elems(q); }
Queue& operator== (const Queue&);
~Queue(){destroy();}

//user Interface
// unchecked operation: front on an empty Queue is undefined
Type& front(){return prear->m_pNext->m_element;}
const Type& front(){return prear->m_pNext->m_element;}

void push(const Type&);
void pop();
bool empty(){ //测试队列是否为空
return prear == 0;
}
private:
Node<Type> *prear; //对尾指针,这个元素的m_pNext又指向对头,形参循环队列
/utility function
void destroy();
void copy_elems(const Queue&);
private: //成员模板,迭代一个其他类型的序列创建队列
template<class Iter> void copy_elems(Iter, Iter);
};

//成员定义
/********************友元操作符<<重定义********************/
template<class Type>
std::ostream& operator<< (std::ostream &os, const Queue<Type> &q)
{
os << "< ";
Node<Type> *p;
for(p = q.prear->m_pNext; p; p = p->m_pNext)
os << p->m_element << " ";
os << ">";
return os;
}
/********************push定义********************/
template<class Type>
void Queue<Type>::push(const Type &elems)
{
Node<Type> *pt = new Node<Type>(elems);
if(empty()){
prear = pt;
pt->m_pNext = prear;
}
else{
pt.m_pNext = prear->m_pNext;
prear->m_pNext = pt;
prear = pt;
}
}
/********************pop定义********************/
template<class Type>
void Queue<Type>::pop()
{
if (!empty())
{
Node<Type> *op = prear->m_pNext;
prear->m_pNext = op->m_pNext;
if (op == prear)
prear = 0;
delete op;
}
}
/********************destroy定义********************/
template<class Type>
void Queue<Type>::destroy()
{
while(!empty())
pop();
}
/********************copy_elems重载版本之一定义********************/
template<class Type>
void Queue<Type>::copy_elems(const Queue &orig)
{
if (empty())
return ;
Node<Type> *pt=orig.prear->m_pNext;
do
{
push(pt->m_element);
pt = pt->m_pNext
} while ( pt != orig.prear->m_pNext );
}
/********************copy_elems重载版本之二定义********************/
template<class Type> template<class Iter>
void Queue<Type>::copy_elems(Iter beg, Iter end)
{
while(beg != end)
{
push(*beg);
++beg;
}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式