循环数组实现队列

同样也是sicily2302的答案

#ifndef QUEUE_H
#define QUEUE_H
//利用循环数组实现一个队列
template <typename T>
class Queue
{
public:
     Queue();   // construct an empty queue
  ~Queue();  // destructor
  Queue(const Queue &rhs);
  const Queue & operator=(const Queue &rhs);
  bool empty() const;
  bool full() const;
  int size() const;
  bool push(const T &x);//enqueue
  bool pop();//dequeue
  const T & front()const;//returns a reference to the front element
private:
 //using a static array of size 100.  
 int begin;
 int rear;
 T* base;
 int maxsize;
};

template<typename T>
Queue<T>::Queue()
{
 base = (T*) new T[100];
 begin = rear = 0;
 maxsize = 100;
}

template<typename T>
Queue<T>::~Queue()
{
 delete [] base;
}

template<typename T>
bool Queue<T>::full() const
{
 if((rear+1) % maxsize == begin)
  return true;
 else
  return false;
}

template<typename T>
bool Queue<T>::empty() const
{
 if(rear == begin)
  return true;
 else
  return false;
}

template<typename T>
int Queue<T>::size() const
{
 return (rear - begin + maxsize)%maxsize;
}

template<typename T>
bool Queue<T>::push(const T &x)
{
 if(full())
 {
  return false;
 }
 else
 {
  base[rear] = x;
  rear = (rear + 1) % maxsize;
  return true;
 }
}

template<typename T>
bool Queue<T>::pop()
{
 if(empty())
 {
  return false;
 }
 else
 {
  begin = (begin + 1) % maxsize;
  return true;
 }
}

template<typename T>
const T & Queue<T>::front()const
{
 return base[begin];
}

template<typename T>
Queue<T>::Queue(const Queue &rhs)
{
 base = NULL;
 operator=(rhs);
}

template<typename T>
const Queue<T>& Queue<T>::operator=(const Queue &rhs)
{
 if(this != &rhs)
 {
  delete [] base;
  maxsize = rhs.maxsize;
  begin = rhs.begin;
  rear = rhs.rear;
  base = new T[maxsize];
  for(int k = 0 ;k < maxsize;k++)
   base[k] = rhs.base[k];
 }
 return *this;
}

#endif

posted @ 2013-02-03 14:43  中大黑熊  阅读(219)  评论(0编辑  收藏  举报