priority_queue 優先級隊列

priority_queue 優先級隊列是一個擁有權值概念的單向隊列queue,在這個隊列中,所有元素是按優先級排列的(也可以認爲queue是個按進入隊列的先後做爲優先級的優先級隊列——先進入隊列的元素優先權要高於後進入隊列的元素)。在計算機操作系統中,優先級隊列的使用是相當頻繁的,進線程調度都會用到。在STL的具體實現中,priority_queue也是以別的容器作爲底部結構,再根據堆的處理規則來調整元素之間的位置。下面給出priority_queue的函數列表和VS2008中priority_queue的源代碼,本文中與heap有關的函數參見《STL系列之四 heap 堆》

priority_queue函數列表
函數 描述      by MoreWindows( http://blog.csdn.net/MoreWindows )
構造析構
priority_queue <Elem> c
 創建一個空的queue 。
注:priority_queue構造函數有7個版本,請查閱MSDN
數據訪問與增減
c.top() 返回隊列頭部數據
c.push(elem) 在隊列尾部增加elem數據
 c.pop() 隊列頭部數據出隊
其它操作
c.empty() 判斷隊列是否爲空
c.size()

返回隊列中數據的個數

 

可以看出priority_queue的函數列表與棧stack的函數列表是相同的。

 

VS2008中priority_queue 優先級隊列的源代碼

友情提示:初次閱讀時請注意其實現思想,不要在細節上浪費過多的時間

 //VS2008中 priority_queue的定義 MoreWindows整理( http://blog.csdn.net/MoreWindows )
template<class _Ty, class _Container = vector<_Ty>, class _Pr = less<typename _Container::value_type> > //默認以vector爲容器的
class priority_queue
{ // priority queue implemented with a _Container
public:
typedef _Container container_type;
typedef typename _Container::value_type value_type;
typedef typename _Container::size_type size_type;
typedef typename _Container::reference reference;
typedef typename _Container::const_reference const_reference;


priority_queue() : c(), comp()
{ // construct with empty container, default comparator
}


explicit priority_queue(const _Pr& _Pred) : c(), comp(_Pred)
{ // construct with empty container, specified comparator
}


priority_queue(const _Pr& _Pred, const _Container& _Cont) : c(_Cont), comp(_Pred)
{ // construct by copying specified container, comparator
make_heap(c.begin(), c.end(), comp); //參見《STL系列之四 heap 堆的相關函數》
}


template<class _Iter>
priority_queue(_Iter _First, _Iter _Last) : c(_First, _Last), comp()
{ // construct by copying [_First, _Last), default comparator
make_heap(c.begin(), c.end(), comp);
}


template<class _Iter>
priority_queue(_Iter _First, _Iter _Last, const _Pr& _Pred) : c(_First, _Last), comp(_Pred)
{ // construct by copying [_First, _Last), specified comparator
make_heap(c.begin(), c.end(), comp);
}


template<class _Iter>
priority_queue(_Iter _First, _Iter _Last, const _Pr& _Pred, const _Container& _Cont) : c(_Cont), comp(_Pred)
{ // construct by copying [_First, _Last), container, and comparator
c.insert(c.end(), _First, _Last);
make_heap(c.begin(), c.end(), comp);
}


bool empty() const
{ // test if queue is empty
return (c.empty());
}


size_type size() const
{ // return length of queue
return (c.size());
}


const_reference top() const
{ // return highest-priority element
return (c.front());
}


reference top()
{ // return mutable highest-priority element (retained)
return (c.front());
}


void push(const value_type& _Pred)
{ // insert value in priority order
c.push_back(_Pred);
push_heap(c.begin(), c.end(), comp);
}


void pop()
{ // erase highest-priority element
pop_heap(c.begin(), c.end(), comp);
c.pop_back();
}


protected:
_Container c; // the underlying container
_Pr comp; // the comparator functor
};


//優先級隊列 priority_queue by MoreWindows( http://blog.csdn.net/MoreWindows )
// 支持 empty() size() top() push() pop() 與stack的操作函數全部一樣
//by MoreWindows
#include <queue>
#include <list>
#include <cstdio>
using namespace std;
int main()
{
//優先級隊列默認是使用vector作容器。
priority_queue<int> a;
priority_queue<int, list<int>> b; //可以這樣聲明,但無法使用
int i;
//壓入數據
for (i = 0; i < 10; i++)
{
a.push(i * 2 - 5);
//b.push(i); //編譯錯誤
}
//優先級隊列的大小
printf("%d\n", a.size());
//取優先級隊列數據並將數據移出隊列
while (!a.empty())
{
printf("%d ", a.top());
a.pop();
}
putchar('\n');
return 0;
}

下面程序是針對結構體的,對數據的比較是通過對結構體重載operator()。

程序功能是模擬排隊過程,每人有姓名和優先級,優先級相同則比較姓名,開始有5個人進入隊列,然後隊頭2個人出隊,再有3個人進入隊列,最後所有人都依次出隊,程序會輸出離開隊伍的順序。

//by MoreWindows( http://blog.csdn.net/MoreWindows )
#include <queue>
#include <cstring>
#include <cstdio>
using namespace std;
//結構體
struct Node
{
char szName[20];
int  priority;
Node(int nri, char *pszName)
{
strcpy(szName, pszName);
priority = nri;
}
};
//結構體的比較方法 改寫operator()
struct NodeCmp
{
bool operator()(const Node &na, const Node &nb)
{
if (na.priority != nb.priority)
return na.priority <= nb.priority;
else
return strcmp(na.szName, nb.szName) > 0;
}
};
void PrintfNode(Node &na)
{
printf("%s %d\n", na.szName, na.priority);
}
int main()
{
//優先級隊列默認是使用vector作容器,底層數據結構爲堆。
priority_queue<Node, vector<Node>, NodeCmp> a;


//有5個人進入隊列
a.push(Node(5, "小譚"));
a.push(Node(3, "小劉"));
a.push(Node(1, "小濤"));
a.push(Node(5, "小王"));


//隊頭的2個人出隊
PrintfNode(a.top());
a.pop();
PrintfNode(a.top());
a.pop();
printf("--------------------\n");


//再進入3個人
a.push(Node(2, "小白"));
a.push(Node(2, "小強"));
a.push(Node(3, "小新"));


//所有人都依次出隊
while (!a.empty())
{
PrintfNode(a.top());
a.pop();
}


return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章