introduction to algorithms 菜鸟笔记 queue

//author:yydrewdrew

 

#define ERROR -1

 

template <class T>
struct snode

 snode *next;
 T value;
};

 

 

template <class T>
class queue
{
public:
 explicit queue();
 void enqueue(const T &t);
 T dequeue();
 queue(const queue<T> &obj);
 bool empty()const;
 void clear();
 queue<T> &operator = (const queue<T> &obj);
 bool operator == (const queue<T> &obj)const;
 bool operator != (const queue<T> &obj)const;
 virtual ~queue();
private:
 void Destory();
 size_t number;
 snode<T> *head;
 snode<T> *tail;
};


template<class T>
queue<T> &queue<T>::operator = (const queue<T> &obj)
{
 if (this != &obj)
 {
  if (obj.tail == NULL)
  {
   Destory();
   tail = NULL;
   number = 0;
  }
  else
  {
   snode<T> *p = new snode<T>;
   snode<T> *p_ = obj.tail;
   p->value = p_->value;
   p->next = NULL;
   snode<T> *_tail = p;
   while (p_->next != NULL)
   {
    p_ = p_->next;
    p->next = new snode<T>;
    p->next->value = p_->value;
    p->next->next = NULL;
    p = p->next;
   }
   Destory();
   tail = _tail;
   number = obj.number;
  }
 }
 return *this;
}


template <class T>
queue<T>::queue<T>():number(0),head(NULL),tail(NULL){}


template<class T>
bool queue<T>::operator == (const queue<T> &obj)const
{
 if (number != obj.number)
 {
  return false;
 }
 bool is = true;
 snode<T> *p = tail;
 snode<T> *_p = obj.tail;
 while (p != NULL && _p != NULL)
 {
  if (p->value != _p->value)
  {
   is = false;
   break;
  }
  p = p->next;
  _p = _p->next;
 }
 return is;
}


template<class T>
void queue<T>::Destory()
{
 while (tail != NULL)
 {
  snode<T> *_p = tail->next;
  delete tail;
  tail = _p;
 }
 number = 0;
}


template<class T>
bool queue<T>::operator != (const queue<T> &obj)const
{
 if (number != obj.number)
 {
  return true;
 }
 bool is = false;
 snode<T> *p = tail;
 snode<T> *_p = obj.tail;
 while (p != NULL && _p != NULL)
 {
  if (p->value != _p->value)
  {
   is = true;
   break;
  }
  p = p->next;
  _p = _p->next;
 }
 return is;
}


template <class T>
void queue<T>::enqueue(const T& t)
{
 if (number == 0)
 {
  head = new snode<T>;
  head->value = t;
  head->next = NULL;
  tail = head;
  ++number;
  return;
 }
 snode<T> *ptem = new snode<T>;
 ptem->next = NULL;
 ptem->value = t;
 head->next = ptem;
 ++number;
 head = ptem;
}


template <class T>
T queue<T>::dequeue()
{
 if (number == 0)
 {
  throw ERROR;
 }
 snode<T> *p_tem = tail;
 tail = tail->next;
 T _t = p_tem->value;
 delete p_tem;
 --number;
 return _t;
}


template<class T>
queue<T>::~queue<T>()
{
 Destory();
}


template<class T>
queue<T>::queue<T>(const queue& obj)
{
 if (obj.tail == NULL)
 {
  tail = NULL;
  head = NULL;
  number = 0;
 }
 else
 {
  snode<T> *p = new snode<T>;
  snode<T> *p_ = obj.tail;
  p->value = p_->value;
  p->next = NULL;
  tail = p;
  number = obj.number;
  while (p_->next != NULL)
  {
   p_ = p_->next;
   p->next = new snode<T>;
   p->next->value = p_->value;
   p->next->next = NULL;
   p = p->next;
  }
 }
}


template <class T>
bool queue<T>::empty()const
{
 return (number == 0);
}


template<class T>
void queue<T>::clear()
{
 Destory();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值