簡體   English   中英

C++中的優先級棧

[英]Priority stack in C++

C++ 標准庫提供了一個帶有priority_queue的優先級隊列。 但它是否也提供了一個優先級堆棧 我尋找priority_stack但沒有找到任何東西。

什么是優先堆棧?

堆棧和隊列是類似的抽象容器數據結構。 它們的主要抽象區別在於堆棧實現了 LIFO 原則(后進先出),而隊列是 FIFO(先進先出)。

優先級與刪除項目的順序正交。 優先級意味着優先級較高的項目在優先級較低的項目之前被刪除:

  • 在這兩種情況下,如果只有一個元素具有最高優先級,它將是第一個被刪除的元素。
  • 但是如果幾個元素具有相同的最高優先級,優先級堆棧將首先刪除最新推送的元素,而優先級隊列將首先刪除第一個入隊的元素。

C++ 標准庫中有優先級堆棧嗎?

不幸的是,標准 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM