链队列的C++ 实现以及循环队列

来源:互联网 发布:淘宝采集赚钱怎么弄 编辑:程序博客网 时间:2024/06/04 01:22

链式队列: 

template<class T>
 struct QNode
{
    T data;
 QNode *next;
 QNode(T m_data=0):data(m_data),next(NULL){};
};
template<class T>
class MyQueue
{
public:
 MyQueue();
 ~MyQueue();
 void EnQueue(T& elem);//元素入队列
 bool DeQueue(T& elem);//元素出队列,即删除队头元素
 bool IsEmpty();//判断队列是否为空
 int QueueLength();//队列的长度
private:
 QNode<T> *front;//队头指针
 QNode<T> *rear;//队尾指针
};

template<class T>
MyQueue<T>::MyQueue()
{
 front=new QNode<T>;
 rear=front;
 rear->next=NULL;
}

template<class T>
void MyQueue<T>::EnQueue(T &elem)
{
    QNode<T> *p=new QNode<T>(elem);
    rear->next=p;
 rear=p;
}

template<class T>
bool MyQueue<T>::DeQueue(T& elem)
{
 if(!IsEmpty())
 {
   QNode<T>* p=front->next;
         front->next=p->next;
         elem=p->data;
   delete p;
         return true;
 }
 else
 {
  return false;
 }
}
template<class T>
bool MyQueue<T>::IsEmpty()
{
 if(front->next==NULL)
  return true;
 else
  return false;
}

template<class T>
int MyQueue<T>::QueueLength()
{
  int len=0;
  QNode<T> *p=front;
  while(p->next)
  {
   len++;
   p=p->next;
  }
  return len;
}

template<class T>
MyQueue<T>::~MyQueue()
{
 T elem;
   while(front->next)
   {
    QNode<T>* p=front->next;
    front->next=p->next;
    delete p;
    p=0;
   }
 delete front;
}

循环队列:

const int MAXSIZE=20;
class CircleQueue
{
public:
 CircleQueue():base(new int[MAXSIZE]),front(0),rear(0){};
 ~CircleQueue()
 {
  delete base;
  front=0;
  rear=0;
 };
 int QueueLength()
 {
  return (rear-front+MAXSIZE)%MAXSIZE;
 }

 bool Enqueue(int elem)
 {
  if((rear+1)%MAXSIZE==front)
  {
           cout<<"队列满了"<<endl;
     return false;
  }
  else
  {
   base[rear]=elem;
   rear=(rear+1)%MAXSIZE;
   return true;
  }
 }

 bool Dequeue(int &data)
 {
  if(front==rear)
  {
   cout<<"队列为空"<<endl;
   return false;
  }
  else
  {
   data=base[front];
   front=(front+1)%MAXSIZE;
   return true;
  }
 }

 bool IsEmpty()
 {
  if(rear==front)
   return true;
  else
   return false;
 }
private:
 int *base;//初始化动态分配存储空间
 int front;//指向队首
 int rear;//指向队尾
};