前段時間在知乎上看到這樣乙個小題目:
用基本型別實現一佇列,佇列要求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...