1. 程式人生 > >C++資料結構 9 順序佇列

C++資料結構 9 順序佇列

佇列:先進先出(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;
}