1. 程式人生 > >資料結構 筆記:佇列的概念及實現(上)

資料結構 筆記:佇列的概念及實現(上)

佇列是一種特殊的線性表

佇列僅能線上性表的兩端進行操作

-隊頭(Front):取出資料元素的一端

-隊尾(Rear):插入資料元素的一端

佇列的特性

-先進先出

佇列的操作

-建立佇列

-銷燬佇列(Queue())

-清空佇列(~Queue())

-進佇列(add())

-出佇列(remove())

-獲取對頭元素(front())

-獲取佇列的長度(length())

template <typename T>
class Queue :public Object
{
public:
    virtual void add(const T& e) = 0;
    virtual void remove() = 0;
    virtual T front() const = 0;
    virtual void clear() = 0;
    virtual int length() const = 0;

};

StaticQueue設計要點

-類模板

·使用原生陣列作為佇列的儲存空間

·使用模板引數決定佇列的最大容量

template <typename T, int N>
class StaticQueue : public Queue<T>
{
protected:
    T m_space[N];
    int m_front;
    int m_rear;
    int m_length;
public:
    StaticQueue()
    {
        m_front = 0;
        m_rear = 0;
        m_length = 0;
    }

    int capacity() const
    {
        return N;
    }
    void add(const T &e)
    {
        if(m_length < N)
        {
            m_space[m_rear + 1] = e;
            m_rear = (m_rear + 1) % N;
            m_length++;
        }
        else
        {
            //丟擲異常
        }
    }

    void remove()
    {
        if(m_length > 0)
        {
            m_front = (m_front + 1) % N;
            m_length--;
        }
        else
        {
            //丟擲異常
        }

    }

    T front() const
    {
        if(m_length > 0)
        {
            return m_space[m_front];
        }
        else
        {
            //丟擲異常
        }
    }

    void clear()
    {
        m_front = 0;
        m_rear = 0;
        m_length = 0;
    }

    int length() const
    {
        return m_length;
    }

};

StaticQueue實現要點(迴圈計數法)

-關鍵操作

·進佇列:m_space[m_rear] = e;m_rear = (m_rear + 1) % N;

·出佇列:m_front = (m_front + 1)% N;

-佇列的狀態

·隊空:(m_length == 0) && (m_front == m_rear)

·隊滿:(m_length == N)&&(m_front == m_rear)

總結:

佇列是一種特殊的線性表,具有先進先出的特性

-佇列值允許線上性表的兩端進行操作,一端進,一端出

-StaticQueue使用原生陣列作為內部儲存空間

-StaticQueue的最大容量由模板引數決定

-StaticQueue採用迴圈計數法提高佇列操作的效率