日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LinkQueue

發(fā)布時間:2025/4/5 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LinkQueue 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

    • 1 鏈式隊列的概念
      • 1.1 隊列的鏈式存儲實現(xiàn)
      • 1.2 鏈式隊列的設(shè)計要點
    • 2 使用LinkList實現(xiàn)鏈式隊列
      • 2.1 繼承關(guān)系圖
      • 2.2 代碼實現(xiàn)
    • 3 使用LinuxList實現(xiàn)LinkQueue
      • 3.1 隊列鏈式存儲實現(xiàn)的優(yōu)化
      • 3.2 代碼實現(xiàn)
    • 4 小結(jié)

1 鏈式隊列的概念

對于StaticQueue,當數(shù)據(jù)元素為類類型時,StaticQueue的對象在創(chuàng)建時,會多次調(diào)用元素類型的構(gòu)造函數(shù),影響效率。我們需要鏈式隊列來解決這個問題。

1.1 隊列的鏈式存儲實現(xiàn)

1.2 鏈式隊列的設(shè)計要點

  • 類模板,抽象父類Queue的直接子類。
  • 在內(nèi)部使用鏈式結(jié)構(gòu)實現(xiàn)元素的存儲。
  • 只在鏈表的頭部和尾部進行操作。

2 使用LinkList實現(xiàn)鏈式隊列

2.1 繼承關(guān)系圖

2.2 代碼實現(xiàn)

LinkQueue.h:

#ifndef LINKQUEUE_H #define LINKQUEUE_H#include "Queue.h" #include "LinkList.h" #include "Exception.h"namespace LemonLib { template <typename T> class LinkQueue : public Queue<T> { protected:LinkList<T> m_list;public:void add(const T &e){m_list.insert(e);}void remove(){if (m_list.length() > 0){m_list.remove(0);}else{THROW_EXCEPTION(InvalidOperationException, "remove error, link queue is empty");}}T front() const{if (m_list.length() > 0){return m_list.get(0);}else{THROW_EXCEPTION(InvalidOperationException, "front error, link queue is empty");}}void clear(){m_list.clear();}int size() const{return m_list.length();} }; }#endif // LINKQUEUE_H

3 使用LinuxList實現(xiàn)LinkQueue

我們可以發(fā)現(xiàn)使用LinkList實現(xiàn)鏈式隊列,在入隊時時間復(fù)雜度為O(n),這顯然是可以優(yōu)化的。

3.1 隊列鏈式存儲實現(xiàn)的優(yōu)化


類的繼承關(guān)系圖如下:

3.2 代碼實現(xiàn)

LinkQueue.h:

#ifndef LINKQUEUE_H #define LINKQUEUE_H#include "Queue.h" #include "LinuxList.h" #include "Exception.h"namespace LemonLib { template <typename T> class LinkQueue : public Queue<T> { protected:struct Node : public Object{list_head head;T e;};list_head m_header;int m_length;public:LinkQueue(){m_length = 0;INIT_LIST_HEAD(&m_header);}void add(const T &e){Node* node = new Node();if (node != NULL){node->e = e;list_add_tail(&node->head, &m_header);m_length++;}else{THROW_EXCEPTION(NoEnoughMemoryException, "linkqueue add error, no enough memory");}}void remove(){if (m_length > 0){list_head* toDel = m_header.next;list_del(toDel);m_length--;delete list_entry(toDel, Node, head);}else{THROW_EXCEPTION(InvalidOperationException, "remove error, link queue is empty");}}T front() const{if (m_length > 0){return list_entry(m_header.next, Node, head)->e;}else{THROW_EXCEPTION(InvalidOperationException, "front error, link queue is empty");}}void clear(){while (m_length > 0){remove();}}int size() const{return m_length;}// 不要忘記提供析構(gòu)函數(shù)~LinkQueue(){clear();} }; }#endif // LINKQUEUE_H

4 小結(jié)

  • StaticQueue在初始化時可能多次調(diào)用元素類型的構(gòu)造函數(shù)。
  • LinkList的組合使用能夠?qū)崿F(xiàn)隊列的功能,但是不夠高效。
  • LinkQueue的最終實現(xiàn)組合使用了Linux內(nèi)核鏈表。
  • LinkQueue中入隊和出隊操作可以在常量時間內(nèi)完成。
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的LinkQueue的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。