日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

模拟实现priority_queue优先级队列

發布時間:2023/11/30 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 模拟实现priority_queue优先级队列 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

優先級隊列

無參構造

priority_queue():c(){}

區間構造

區間構造需要用到迭代器,而迭代器每個容器的類型不一樣,所以用模板給出,初始化列表,把用戶給進來的元素空間起始位置,放到優先級隊列中底層空間的位置,然后進行調整,把它調整成一個堆

template<class Iterator>priority_queue(Iterator first, Iterator last): c(first,last){//將c中的元素調整成堆的結構size_t count = c.size();//倒數第一個非葉子結點int root = (count - 2) / 2;for (; root >= 0; root--)AdjustDown(root);}

元素操作

void push(const T& data){c.push_back(data);//插完元素后,破壞了堆的性質,重新調整AdjustUp(c.size() - 1);}void pop(){if (empty())return;swap(c.front(), c.back());c.pop_back();//重新調整AdjustDown(0);}size_t size()const{return c.size();}bool empty()const{return c.empty();}//堆頂元素不允許修改,因為堆頂元素修改可能會破壞堆的特性const T& top() const{return c.front();}

向下調整和向上調整

參考下面這個鏈接里的內容
詳解堆的應用

如何判斷com中雙親放在前面還是孩子放在前面

默認按照less方式進行比較
less---->大堆------->大的元素往上提

com(c[parent],c[child])

雙親比孩子小,讓孩子往上走

bool operator()(const T& left ,const T& right) {return left < right; }

大于的方式比較-------小堆
小于的方式比較-------大堆

完整代碼

#include<iostream> #include<algorithm> #include<vector> using namespace std;namespace bite {template<class T ,class Container = vector<T>,class Compare = less<T>>class priority_queue{public:priority_queue():c(){}template<class Iterator>priority_queue(Iterator first, Iterator last): c(first,last){//將c中的元素調整成堆的結構size_t count = c.size();//倒數第一個非葉子結點int root = (count - 2) / 2;for (; root >= 0; root--)AdjustDown(root);}void push(const T& data){c.push_back(data);AdjustUp(c.size() - 1);}void pop(){if (empty())return;swap(c.front(), c.back());c.pop_back();AdjustDown(0);}size_t size()const{return c.size();}bool empty()const{return c.empty();}//堆頂元素不允許修改,因為堆頂元素修改可能會破壞堆的特性const T& top() const{return c.front();}private:void AdjustDown(int parent){int child = parent * 2 + 1;while (child < c.size()){//找以parent為根的兩個孩子中較大的孩子if (child + 1 < c.size() && com(c[child], c[child + 1]))child += 1;//檢測雙親是否滿足情況if (com(c[parent] , c[child])){swap(c[child], c[parent]);parent = child;child = parent * 2 + 1;}elsereturn;}}void AdjustUp(int child){int parent = (child - 1) / 2;while (child){if (com(c[parent] , c[child])){swap(c[child], c[parent]);child = parent;parent = (child - 1) / 2;}else{return;}}}private:Container c; //存儲方式Compare com; //比較方式};}

測試

int main() {int array[] = { 8, 1, 9, 3, 6, 4, 5, 0, 2, 7 };bite::priority_queue<int>q(array, array + sizeof(array) / sizeof(array[0]));cout << q.top() << endl;system("pause");return 0; }

總結

以上是生活随笔為你收集整理的模拟实现priority_queue优先级队列的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。