亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++循環隊列實現模型

2020-01-26 15:11:05
字體:
來源:轉載
供稿:網友

本文實例講述了C++循環隊列實現模型。分享給大家供大家參考。具體分析如下:

前段時間在知乎上看到這樣一個小題目:

用基本類型實現一隊列,隊列要求size是預先定義好的的。而且要求不可以使用語言自帶的api,如C++的STL。普通的實現很簡單,但是現在要求要盡可能的時間和空間復雜度的優化,要和語言自帶的api比較時間和空間。這個隊列還要支持如下的操作:

constructor: 初始化隊列

enqueue:入隊

dequeue:出隊

隊列是一種基本的數據結構,在平常的應用中十分廣泛,多數情況隊列都是用鏈表實現的。但是對于本題而言,用鏈表實現就有這樣一個問題:由于每個結點都存在至少一個指向前一個結點或后一個結點的指針,這就帶來了空間復雜度的加大,所以并不太適合要求。

這個時候我想到了boost中的boost::circular_buffer,它是通過類似于數組的底層結構實現的一個循環buffer。而數組的優點是空間復雜度夠小(除去維持數據結構的索引項,空間復雜度為線性),再實現成循環結構可以最大化的利用空間。而且在隊列這樣一種只在前后端插入刪除的情況下,其push和pop的時間復雜度也只有O(1)。

基本實現如下:

復制代碼 代碼如下:

#ifndef __CIRCULAR_QUEUE_H__
#define __CIRCULAR_QUEUE_H__

#include <stddef.h>

template<typename T>
class circular_queue
{
public:
    explicit circular_queue(size_t maxsize)
        : maxsize_(maxsize + 1), head_(0), rear_(0)
    {
        array_ = new T[maxsize_];
    }

    circular_queue(size_t maxsize, const T& val)
        : maxsize_(maxsize + 1), head_(0), rear_(0)
    {
        array_ = new T[maxsize_];
        for (size_t i = 0; i != maxsize; ++i)
        {
            array_[i] = val;
        }
        rear_ = maxsize;
    }

    circular_queue(const circular_queue& rhs)
        : maxsize_(rhs.maxsize_), head_(rhs.head_), rear_(rhs.rear_)
    {
        array_ = new T[maxsize_];
        for (int i = 0; i != maxsize_; ++i)
        {
            array_[i] = rhs.array_[i];
        }
    }

    ~circular_queue()
    {
        delete [] array_;
    }

    circular_queue& operator=(const circular_queue& rhs)
    {
        if (this == &rhs)
        {
            return *this;
        }
        delete [] array_;
        maxsize_ = rhs.maxsize_;
        head_ = rhs.head_;
        rear_ = rhs.rear_;
        array_ = new T[maxsize_];
        for (int i = 0; i != maxsize_; ++i)
        {
            array_[i] = rhs.array_[i];
        }
        return *this;
    }

    bool empty() const
    {
        return head_ == rear_;
    }

    size_t size() const
    {
        return (rear_ - head_ + maxsize_) % maxsize_;
    }

    T& front()
    {
        return array_[head_];
    }

    const T& front() const
    {
        return array_[head_];
    }

    void push(const T& val)
    {
        if ((rear_ + 1) % maxsize_ != head_)
        {
            array_[rear_] = val;
            rear_ = (rear_ + 1) % maxsize_;
        }
    }

    void pop()
    {
        if (head_ != rear_)
        {
            head_ = (head_ + 1) % maxsize_;
        }
    }

private:
    size_t  maxsize_;
    int     head_;
    int     rear_;
    T*      array_;
};

#endif

隊列長度 = 數組長度 - 1

預留了一個單位的數組元素空間作為隊尾標記。

這個只是簡陋的實現,沒有考慮到一些情況,比如線程安全、STL算法,函數對象的兼容等。代碼只是簡單的測試了一下,如有錯誤歡迎指正:)

總的來說,這種思路的循環隊列有以下優點:

1、使用固定的內存,不需要隱式或意外的內存分配。

2、從前端或后端進行快速的常量時間的插入和刪除元素。

3、快速的常量時間的對元素進行隨機訪問。(如果需要的話可以定義operator[])

4、適用于實時和對性能有嚴格要求的應用程序。

還可以進一步擴展,當隊列滿的時候,從一端插入則覆蓋沖洗掉另一端的數據,這樣的一個模型可以應用于這些場合:

保存最近接收到的取樣數據,在新的取樣數據到達時覆蓋最舊的數據。
一種用于保存特定數量的最后插入元素的快速緩沖。
高效的固定容量FIFO(先進先出)或LIFO(后進先出)隊列,當隊列滿時刪除最舊的(即最早插入的)元素。

希望本文所述對大家的C++程序算法設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲色图狂野欧美| 欧美日本亚洲视频| 国产美女搞久久| 久久视频精品在线| 国产日本欧美一区二区三区| 亚洲欧美国产制服动漫| 成人性生交大片免费看小说| 亚洲欧洲国产伦综合| 亚洲第一精品电影| 亚洲第一福利网站| 亚洲美女又黄又爽在线观看| 亚洲二区在线播放视频| 91av免费观看91av精品在线| 国内精品久久久久久久| 久久69精品久久久久久久电影好| 久久久久久有精品国产| 久久精品影视伊人网| 98视频在线噜噜噜国产| 欧美亚洲成人xxx| 欧美老女人bb| 亚洲的天堂在线中文字幕| 亚洲欧洲av一区二区| 久久久久久免费精品| 日韩高清av一区二区三区| 欧美成人精品一区二区| 国产在线视频2019最新视频| 亚洲网址你懂得| 国产精品视频大全| 久久亚洲成人精品| 国产不卡av在线免费观看| 亚洲国产美女精品久久久久∴| 欧美丝袜美女中出在线| 亚洲性69xxxbbb| 国产亚洲欧洲高清| 日韩中文综合网| 伊人亚洲福利一区二区三区| 夜夜嗨av一区二区三区四区| 国产在线高清精品| 久久久亚洲网站| 久久中文精品视频| 欧美丝袜一区二区三区| 成年无码av片在线| 久久久精品日本| 国语自产偷拍精品视频偷| 中文字幕亚洲欧美一区二区三区| 欧美丝袜一区二区| 国产成人精品日本亚洲专区61| 欧美在线视频观看免费网站| 夜夜嗨av色综合久久久综合网| 91av在线视频观看| 日韩一中文字幕| 性亚洲最疯狂xxxx高清| 国产精品av免费在线观看| 欧美日韩一区二区免费在线观看| 日韩精品视频免费在线观看| 久久影院中文字幕| 国产精自产拍久久久久久蜜| 久国内精品在线| 日本久久精品视频| 国产日韩精品在线观看| 欧美精品精品精品精品免费| 精品久久久久久久久久久久| 91网站在线看| 欧美在线视频导航| 亚洲最大的av网站| 久久久亚洲国产天美传媒修理工| 久久久久久九九九| 国产成人欧美在线观看| 97高清免费视频| 国产精品福利在线观看网址| 欧美天堂在线观看| 日韩av电影手机在线观看| 亚洲自拍偷拍网址| 在线日韩日本国产亚洲| 国产精品va在线| 色悠悠久久88| 91久久精品国产91性色| 午夜精品一区二区三区视频免费看| 91久久久久久久久久久| 日韩一区二区在线视频| 午夜精品久久久久久99热软件| 久久精品国产清自在天天线| 富二代精品短视频| 色综合久久久久久中文网| 午夜精品久久久久久99热软件| 国产精品青青在线观看爽香蕉| 亚洲缚视频在线观看| 久久成人这里只有精品| 日韩美女在线观看| 亚洲老板91色精品久久| 亚洲社区在线观看| 一区二区三区回区在观看免费视频| 91精品免费看| 97在线精品国自产拍中文| 欧美精品一区二区免费| 亚洲欧美中文字幕| 国产精品久久久久影院日本| 中文字幕av日韩| 一区二区欧美日韩视频| 亚洲香蕉成视频在线观看| 精品亚洲va在线va天堂资源站| 韩剧1988免费观看全集| 国产精品综合不卡av| 欧美性高跟鞋xxxxhd| 精品国产一区二区三区久久狼黑人| 亚洲视频专区在线| 久久国产精品网站| 欧美日韩国产在线看| 国产日韩在线亚洲字幕中文| 亚洲福利视频二区| 亚洲国产成人在线视频| 久久久久久亚洲精品不卡| 欧美精品在线播放| 亚洲最大福利视频| 国产精品一久久香蕉国产线看观看| 亚洲jizzjizz日本少妇| 成人妇女免费播放久久久| 在线亚洲午夜片av大片| 国产亚洲欧美视频| 91超碰中文字幕久久精品| 成人欧美一区二区三区在线| 欧美亚洲国产另类| 欧美成人四级hd版| 欧美日韩在线看| 国产又爽又黄的激情精品视频| 日韩精品视频三区| 亚洲久久久久久久久久| 日韩亚洲第一页| 亚洲国产精品专区久久| 亚洲精品美女久久久久| 日韩av电影院| 欧美一区二区大胆人体摄影专业网站| 亚洲性夜色噜噜噜7777| 亚洲欧美在线一区二区| 国产精品自产拍在线观看| 亚洲欧美日韩高清| 久久精品国产欧美亚洲人人爽| 国产高清在线不卡| 欧美一乱一性一交一视频| 精品人伦一区二区三区蜜桃网站| 日韩三级影视基地| 国产精品网站入口| 最近2019中文字幕第三页视频| 亚洲永久在线观看| 2020欧美日韩在线视频| 国产精品成人国产乱一区| 久久成人精品一区二区三区| 精品日韩中文字幕| 欧美激情乱人伦| 日韩av片永久免费网站| 成人av在线亚洲| 欧美激情欧美狂野欧美精品| 九九九热精品免费视频观看网站| 91视频国产高清| 亚洲国产精彩中文乱码av在线播放| 国产精品夜间视频香蕉| 国产a∨精品一区二区三区不卡| 色综合天天综合网国产成人网| 久久天天躁狠狠躁夜夜av| 午夜免费久久久久| 欧美一级大片在线免费观看| 亚洲精品网站在线播放gif| 国产精品扒开腿做| 亚洲精品成人av|