C 迴圈佇列實現模型

2022-10-04 04:03:09 字數 2055 閱讀 4784

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

用基本型別實現一佇列,佇列要求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

template

class circular_queue

circular_queue(size_t maxsize, const t& val)

: maxsize_(maxsize + 1), h程式設計客棧ead_(0), rear_(0)

rear_ = maxsize;

}circular_queue(const circular_queue程式設計客棧& rhs)

: maxsize_(rhs.maxsize_), head_(rhs.head_), rear_(rhs.rear_)

}~circular_queue()

circular_queue& operator=(const circular_queue& rhs)

delete array_;

maxsize_ = rhs.maxsize_;

head_ = rhs.head_;

rear_ = rhs.rear_;

array_ = new t[maxsize_];

for (int i = 0; i != maxsize_; ++i)

return *this;

}bool empty() const

size_t size() const

t& front()

const t& front() const

void push(const t& val)

}void pop()

}private:

size_t  maxsize_;

int     head_;

int     rear_;

t*      array_;

};程式設計客棧#endif

佇列長度 = 陣列長度 - 1

預留了乙個單位的陣列元素空間作為隊尾標記。

這個只是簡陋的實現,沒有考慮到一些情況,比如執行緒安全、stl演算法,函式物件的相容等。**只是簡單的測試了一下,如有錯誤歡迎指正:)

總的來說,這種思路的迴圈佇列有以下優點:

1、使用固定的記憶體,不需要隱式或意外的記憶體分配。

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

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

4、適用於實時和對效能有嚴格要求的應用程式。

還可以進一步擴充套件,當佇列滿的時候,從一端插入則覆蓋沖洗掉另一端的資料,這樣的乙個模型可以應用於這些場合:

儲存最近接收到的取樣資料,在新的取樣資料到達時覆蓋最舊的資料。

一種用於儲存特定數量的最後插入元素的快速緩衝。

高效的固定容量fifo(先進先出)或lifo(後進先出)佇列,當佇列滿時刪除最舊的(即最早插入的)元素。

本文標題: c++迴圈佇列實現模型

本文位址: /ruanjian/c/117865.html

迴圈佇列模型

迴圈佇列存在乙個問題 隊頭 隊尾時,佇列的情況可能為空也可能為滿。決絕問題的方法為重新定義佇列的滿和空 頭和尾之間始終空出乙個不用的資料空間,隊列為空的時候,頭在尾前乙個位置,滿的時候頭尾之間相差乙個空的資料,即頭在尾部前兩個位置。檔名 circlequeue.c 檔案描述 實現迴圈佇列模型 修改日...

C 迴圈佇列實現

乙個迴圈佇列的c語言實現,資料型別queue定義如下,注意在typedef structqueue 中queue為資料型別,而在struct queue 中queue為乙個變數名。front為隊首元素下標,始終指向隊首元素,tail為隊尾元素的下乙個位置的下標。初始狀態為front tail 0 t...

C 實現迴圈佇列

circularqueue.h pragma once pragma once ifndef circularqueue h define circularqueue h include include using std cout using std cin using std endl usin...