佇列也是一種特殊的線性表,特殊在於只允許在一端插入元素,在另一端刪除元素,所以佇列有先進先出的特性
佇列的可以分為普通佇列和帶有優先順序的佇列
隊頭:允許刪除元素的一端
隊尾:允許插入元素的一端
入隊:向佇列中插入元素操作
出隊:從佇列中刪除元素操作
#ifndef queue_h_
#define queue_h_
#include #include "list/deque.h"
template >
class queue : noncopyable
bool empty() const
t& front() const
t& back() const
void push(t elem)
void pop()
// for unit test
void print(const char* name)
private:
container m_container;
};#endif // queue_h_
可以通過模板引數指定佇列的底層的儲存結構,比如:
deque和list的實現**詳見部落格《資料結構 – 線性表》或者github原始碼
核心函式如下:
函式功能
時間複雜度
front
檢視隊頭元素
o(1)
back
檢視隊尾元素
o(1)
push
入隊o(1)
pop出隊
deque: o(n), list: o(1)
這裡就可以看出問題,採用deque做底層容器時出隊的時間複雜度為o(n),原因在於陣列下標為0的位置始終作為隊頭,這樣出隊之後,需要將陣列中的其他元素向前移動
如果陣列中任何乙個位置都可以作為隊頭,用front指標來表徵隊頭的位置,那麼出隊的操作將是隊頭指標的改變,其他元素不用遷移,這樣出隊操作的時間複雜度將會是o(1)
但是這樣會出現另外的問題,隨著出隊,隊頭指標後移,那麼陣列前面的空間將不能儲存元素,因為佇列的特性是只能隊尾插入元素
可以使用迴圈佇列解決這一問題
迴圈佇列是指首尾相連的佇列,用head和tail指標來表明隊頭和隊尾
迴圈佇列需要考慮乙個問題:head == tail時是表示隊列為空還是為滿呢?有兩種方式實現:
#ifndef circlequeue_h_
#define circlequeue_h_
#include #include #define default_capacity 10
template class circlequeue : noncopyable
~circlequeue()
int size() const
bool empty() const
t& front() const
t& back() const
void push(t elem)
m_data[m_tail] = elem;
++ m_tail;
m_tail %= m_capacity+1;
} void pop()
} // for unit test
void print(const char *name)
std::cout << "data = [";
for(int i = 0; i < size; ++ i)
std::cout << "]" << std::endl;
}private:
void resize(int newcapactiy)
m_capacity = newcapactiy;
m_head = 0;
m_tail = size;
m_data = newdata;
}private:
int m_capacity;
int m_size;
int m_head, m_tail; // tail指向隊尾已有元素的下乙個位置
t *m_data;
};#endif // circlequeue_h_
帶有優先順序的佇列是指元素在入棧時會按照排序規則(公升序/降序)插入到指定的位置,這樣就能按照大小順序出隊了
帶有優先順序的佇列更適合使用樹型結構來實現(二叉堆),這樣時間複雜度更低
資料結構 佇列
一 佇列的迴圈陣列實現。1 初始化 空佇列。令rear front 0。2 入佇列 約定rear指向佇列尾元素的下乙個位置。入佇列時,先判斷佇列是否已滿,而後將array rear x 然後rear 3 出佇列 約定front指向佇列的首元素位置。出佇列時,先判斷佇列是否為空,而後返回隊首元素re ...
資料結構 佇列
資料參考自 資料結構c 語言描述 佇列是一種先進先出的資料結構,這與棧正好相反。下例是簡單的queue實現 queue.h檔案 ifndef queue h define queue h include include 資料元素結構 自定義 struct datatype 佇列元素最大數 const...
資料結構 佇列
code for fun created by dream whui 2015 1 25 include stdafx.h include include using namespace std define true 1 define false 0 define ok 1 define erro...