模擬實現隊列

隊列:在隊尾插入元素,在隊頭刪除元素,符合先進先出原則;
棧:符合先進後出原則;

隊列的分類:
1.順序隊列
2.循環隊列
3.鏈式隊列
4.優先級隊列
5.雙端隊列

循環隊列的實現方法:

方法一:使用rear和front標記,當rear走到最後一個元素時,下一步爲rear=rear%最大容量,當(rear+1)%最大容量=front時,表示隊列已滿,隊列空的標記仍舊爲rear=front
方法二:設置一個標記flag,初始值爲0,插入元素時flag=1,刪除元素時flag=0;
當rear==front && flag==0時表示隊列空
當rear==front && flag==1時表示隊列已滿
方法三:設置一個計數器count,當元素入隊列時,count+1,當元素出隊列時,count-1,count==capacity(容量)時,表示隊列滿;

第三種方法的代碼如下:

#include<iostream>
using namespace std;

template<class T>
class Queue
{
public:
    Queue(size_t capacity = 5)
        :_front(0)
        ,_rear(0)
        ,_capacity(capacity+3)
        ,_count(0)
    {
        _pData=new T[_capacity];
    }
    void Push(const T& x)
    {
        if(_count==_capacity)
        {
            cout<<"隊列已滿"<<endl;
            return;
        }
        _pData[_rear]=x;
        _rear=(_rear+1)%_capacity;
        _count++;
    }
    void Pop()
    {
        if(Empty())
        {
            cout<<"隊列已空"<<endl;
            return;
        }
        _count--;
        _front=(_front+1)%_capacity;
    }

    T& Front()
    {
        return _pData[_front];
    }
    const T& Front()const
    {
        return _pData[_front];
    }
    T& Back()
    {
        return _pData[(_rear-1)%_capacity];
    }
    const T& Back()const
    {
        return _pData[(_rear-1)%_capacity];
    }
    size_t Size()const
    {
        return _count;
    }
    bool Empty()const
    {
        return 0==_count;
    }
    ~Queue()
    {
        if(_pData)
        {
            delete[] _pData;
            _pData=NULL;
        }
    }
private:
    T* _pData;
    size_t _capacity;
    size_t _front;
    size_t _rear;
    size_t _count;
};

測試代碼:

void FunTest()
{
    Queue<int> q;
    q.Push(1);
    q.Push(2);
    q.Push(3);
    q.Push(4);
    q.Push(5);
    q.Push(6);
    q.Push(7);
    q.Push(8);
    cout<<q.Size()<<endl;
    cout<<q.Front()<<endl;
    cout<<q.Back()<<endl;
    q.Pop();
    q.Pop();
    cout<<q.Size()<<endl;
    cout<<q.Front()<<endl;
    cout<<q.Back()<<endl;
    q.Pop();
    q.Pop();
    q.Pop();
    q.Pop();
    q.Pop();
    q.Pop();
    cout<<q.Empty()<<endl;
    cout<<q.Size()<<endl;
}

int main()
{
    FunTest();
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章