C++数据结构 9 顺序队列

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014183456/article/details/83018441

队列:先进先出(FIFO)或者后进后出(LILO)

#ifndef __QUEUE_H_
#define __QUEUE_H_

#include <iostream>
#include <algorithm>
using namespace std;
template <class T>
class Queue
{
  public:
      Queue(int capacity=10);  //构造函数默认大小为10
      ~Queue();               //析构函数 释放myqueue
      bool isEmpty ()const;  //判断是否为空
     // bool isFull ()const;   //判断是否队列满
      T& Front()const;              //查看队首元素
      T& Rear()const;               //查看队尾元素
      void Push(const T &item);      //入队列
      void Pop();              //出队列
  private:
    T *myqueue;
    int Capacity;   //队列大小
    int myFront;      //队首下标
    int MyRear;       //队尾下标
};

template<class T>
Queue<T>::Queue(int capacity):Capacity(capacity)  //初始化构造函数
{
    if(capacity<1)
        throw "Error";  //引发异常
   myqueue=new T[capacity];  //动态创建一个数组
   myFront=MyRear=0;   //队首和队尾指向0
}

template<class T>
Queue<T>::~Queue()
{
    delete []myqueue;
}

template<class T>
bool Queue<T>::isEmpty () const //判断是否为空
{
    return myFront==MyRear;
}


template<class T>
T& Queue<T>::Front() const   //查看队首元素
{
    if(isEmpty())
        throw "Queue is Empty";
    return myqueue[(myFront+1)%Capacity];  //因为myFront指向的队列不包含数据,所以第一个数据是myFront+1,因为组成循环队列,所以%Capacity
}

template<class T>
T& Queue<T>::Rear() const      //查看队尾元素
{
      if(isEmpty())
        throw "Queue is Empty";
        return myqueue[MyRear];  //返回队尾数据
}

template<class T>
void Queue<T>::Push(const T& item)    //从队尾(rear)插入数据
{
   if(((MyRear+1)%Capacity)==myFront)
   {
       T *temp=new T[Capacity*2];  //扩大两倍大小
       int start=(myFront+1)%Capacity;
       if(start<2)  //rear没有回环
        {
            copy(myqueue+start,myqueue+start+Capacity-1,temp); //复制数据到temp里面
        }
      else //产生回环  需要复制两次
      {
         copy(myqueue+start,myqueue+start+Capacity-1,temp);
         copy(myqueue,myqueue+MyRear+1,temp+Capacity-start);
      }
      myFront=2*Capacity-1;  //把front重新归位
      MyRear=Capacity-1;
      Capacity=Capacity*2;
      delete []myqueue;  //删除原数据
      myqueue=temp; //把新指针重新赋值给muqueue

   }
   else
   {
      MyRear=(MyRear+1)%Capacity;  //MyRear+1
   }
   myqueue[MyRear]=item;
}

template <class T>
void Queue<T>::Pop()   //出队列
{
    if(isEmpty())
        throw "Queue is Empty";
     myFront=(myFront+1)%Capacity;
     myqueue[myFront].~T();
}
#endif // __QUEUE_H_

main函数:

#include <iostream>
#include "Queue.h"
using namespace std;

int main()
{
    Queue<int> q;
    q.Push(11);
    q.Push(10);
    q.Push(2);
    q.Push(1);
    q.Push(9);
    cout<<q.Front()<<" "<<q.Rear()<<endl;
    //cout<<<<" ";
     q.Push(68);
      cout<<q.Front()<<" "<<q.Rear()<<endl;
      q.Pop();
      cout<<q.Front()<<" "<<q.Rear()<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/u014183456/article/details/83018441
今日推荐