[英]Priority stack in C++
C++ 標准庫提供了一個帶有priority_queue
的優先級隊列。 但它是否也提供了一個優先級堆棧? 我尋找priority_stack
但沒有找到任何東西。
堆棧和隊列是類似的抽象容器數據結構。 它們的主要抽象區別在於堆棧實現了 LIFO 原則(后進先出),而隊列是 FIFO(先進先出)。
優先級與刪除項目的順序正交。 優先級意味着優先級較高的項目在優先級較低的項目之前被刪除:
不幸的是,標准 C++ 只提供一個priority_queue
。 這是一個適配器。
沒有priority_stack
。 所以你需要實現自己的。
假設:我認為原因是優先級堆棧是相當奇特的東西。 肯定有有效的用例,但堆棧的大多數用途是以迭代方式實現一些遞歸算法,其中優先級沒有意義。
如果你不知道從哪里開始,這里有一個快速而骯臟的實現:
template<class T>
class priority_stack {
vector<T> stack;
public:
bool empty() const { return stack.size()==0; }
void push(const T& x) {
stack.push_back(x);
for (int i=stack.size()-1; i!=0; i--)
if ( (stack[i]<stack[i-1])) // assuming priority is reflected in order of elements
swap (stack[i-1],stack[i]);
}
void pop() {
if (! empty() )
stack.resize(stack.size()-1);
}
T top() {
if (empty())
throw;
return stack[stack.size()-1];
}
};
您可以使用以下數據結構對其進行測試:
struct data {
int priority;
string message;
bool operator< (const data&a) const { // order by priority
return priority<a.priority;
}
};
在線演示將向您展示不同之處:
Data to be pushed:(10,one) (10,two) (11,high) (12,very high) (10,three)
Priority queue (FIFO): (12,very high) (11,high) (10,one) (10,two) (10,three)
Priority stack (LIFO): (12,very high) (11,high) (10,three) (10,two) (10,one)
注意:如果您的數據元素非常大,將結構基於列表而不是向量可能更有趣,並將推送的數據插入正確的位置,從而最大限度地減少交換。
在 C++ 中,標准模板庫 (STL) 提供了一個 priority_queue。 參見例如priority_queue 。 STL 不提供priority_stack 容器。 如果你喜歡,你可以寫一篇。 希望有幫助。
在常規隊列或堆棧中,元素移除的順序取決於插入的順序(隊列的順序相同,堆棧的順序相反)。
在優先級隊列中,順序不取決於插入的順序,而是取決於分配給每個元素的一些自定義“優先級”。 優先級隊列首先給出具有最高優先級的元素。
例如:一個優先級隊列(A 1) (B 3) (C 2)
將按順序給出元素BCA
。
不清楚你說的“優先堆棧”是什么意思,但如果堆棧只是一個移除順序顛倒的隊列,那么“優先堆棧”的自然解釋是一個優先級隊列,其中移除的順序顛倒,即給元素優先級最低。 但這與優先級隊列相同,其中優先級被反轉(通常只是通過否定它們):
示例:“優先級堆棧” (A 1) (B 3) (C 2)
,它將給出順序ACB
,將與優先級隊列(A -1) (B -3) (C -2)
.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.