中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

數據結構(07)_隊列

發布時間:2020-07-31 12:09:05 來源:網絡 閱讀:251 作者:三九感冒靈 欄目:編程語言

1. .隊列的概念和實現

1.1.隊列的概念

隊列是一種特殊的線性表,僅能在線性表的兩端進行操作。

  • -隊頭(front)取出數據元素的一端;
  • -隊尾(rear)插入數據元素的一端。
    隊列的特性:
    數據結構(07)_隊列
    隊列的常用操作:
    創建和銷毀;出隊和入隊;清空隊列;獲取隊首元素;獲取隊列長度
    數據結構(07)_隊列
    隊列聲明(接口):
    template < typename T >
    class Queue
    {
    public:
    virtual void enqueue(const T& e) = 0;
    virtual void dequeue() = 0;
    virtual T front() const = 0;
    virtual void clear() = 0;
    virtual int length() const = 0;
    };

    1.2.StaticQueu

    順序隊列的實現:
    數據結構(07)_隊列
    設計要點:
    類模板,使用原生數組作為隊列 存儲空間,使用模板參數決定隊列的最大容量;

    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()
    void enqueue(const T& e)
    void dequeue()
    T front() const
    void clear()
    int length() const
    int capacity() const
    };

    注意事項:
    StaticQueue實現要點:(循環計數法) 提高隊列操作的效率(本質上時循環隊列)
    關鍵操作:

  • 入隊: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最終實現:

    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()   //O(1)
    {
        m_front = 0;
        m_rear = 0;
        m_length = 0;
    }
    
    void enqueue(const T& e)   //O(1)
    {
        if(m_length < N)
        {
            m_space[m_rear] = e;
            m_rear = (m_rear + 1) % N;
            m_length++;
        }
        else
        {
            THROW_EXCEPTION(InvalidOperationException, "no space in current staticqueue...");
        }
    }
    
    void dequeue()   //O(1)
    {
        if(m_length > 0)
        {
            m_front = (m_front + 1) % N;
            m_length--;
        }
        else
        {
            THROW_EXCEPTION(InvalidOperationException, "no element in current staticqueue...");
        }
    }
    
    T front() const   //O(1)
    {
        if(m_length > 0)
        {
            return m_space[m_front];
        }
        else
        {
            THROW_EXCEPTION(InvalidOperationException, "no element in current staticqueue...");
        }
    }
    
    void clear()   //O(1)
    {
        m_front = 0;
        m_rear = 0;
        m_length = 0;
    }
    
    int length() const   //O(1)
    {
        return  m_length;
    }
    
    int capacity() const   //O(1)
    {
        return N;
    }
    
    bool is_empty()   //O(1)
    {
        return (m_length == 0) && (m_front == m_rear);
    }
    
    bool is_full()   //O(1)
    {
        return (m_length == N) && (m_front == m_rear);
    }
    };

    2.鏈式隊列

    2.1.LinkQueue

    順序隊列的缺陷:當數據為類類型時,StaticQueue的對象在創建時,會多次調用元素類型的構造函數,影響效率。所以我們采用鏈式存儲結構來實現隊列。
    數據結構(07)_隊列
    設計要點:
    1.類模板,繼承自抽象父類Queue;
    2.在內部使用鏈式結構實現元素的存儲
    3.只在鏈表的頭部和尾部進行操作。
    數據結構(07)_隊列
    LinkQueue聲明:

    template <typename T>
    class LinkQueue : public Queue<T>
    {
    protected:
    LinkList<T> m_list;
    public:
    LinkQueue(){}
    void enqueue(const T& e)    //O(n)
    void dequeue()      //O(1)
    T front() const //O(1)
    void clear()        //O(n)
    int length() const  //O(1)
    };

    LinkQueue最終實現:

    template <typename T>
    class LinkQueue : public Queue<T>
    {
    protected:
    LinkList<T> m_list;
    public:
    LinkQueue(){}
    
    void enqueue(const T& e)    //O(n)
    {
        m_list.insert(e);
    }
    
    void dequeue()      //O(1)
    {
        if(m_list.length() > 0)
        {
            m_list.remove(0);
        }
        else
        {
            THROW_EXCEPTION(InvalidOperationException, "no elemet in current LinkQueue...");
        }
    }
    
    T front() const //O(1)
    {
        if(m_list.length() > 0)
        {
            return m_list.get(0);
        }
        else
        {
            THROW_EXCEPTION(InvalidOperationException, "no elemet in current LinkQueue...");
        }
    }
    
    void clear()        //O(n)
    {
        while (m_list.length() > 0)
        {
            m_list.remove(0);
        }
    }
    
    int length() const  //O(1)
    {
        return m_list.length();
    }
    };

    LinkQueue中,入隊操作由于只能操作隊列的尾部(鏈表的最后位置),要進行遍歷操作,所以時間復雜度為O(n),可以使用雙向循環鏈表代替單鏈表來解決這個問題。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

隆安县| 临清市| 类乌齐县| 大港区| 武定县| 盐源县| 长武县| 桐城市| 济宁市| 衡阳县| 中超| 德昌县| 福安市| 井研县| 扎赉特旗| 四会市| 都安| 绥芬河市| 昌宁县| 基隆市| 手游| 铁岭市| 新余市| 神农架林区| 宜兰县| 陇南市| 崇州市| 临高县| 谢通门县| 彭山县| 桓台县| 双辽市| 札达县| 广州市| 手游| 内江市| 通化市| 鄂州市| 内丘县| 湘潭市| 巴中市|