資料結構 佇列

2021-10-02 13:14:23 字數 2232 閱讀 3813

佇列也是一種特殊的線性表,特殊在於只允許在一端插入元素,在另一端刪除元素,所以佇列有先進先出的特性

佇列的可以分為普通佇列和帶有優先順序的佇列

隊頭:允許刪除元素的一端

隊尾:允許插入元素的一端

入隊:向佇列中插入元素操作

出隊:從佇列中刪除元素操作

#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...