最小優先隊列
總體表述
隊列屬於容器的一種。
不同於雙向鏈表類容器,可以在容器的任意位置執行元素插入和刪除,
隊列容器只允許在尾部插入元素,在首部刪除元素。
隊列屬於操作受限的容器。
最小優先隊列,屬於具備特殊性質的隊列。
向隊列添加元素時,按優先級確定插入位置。
從隊列取元素時,每次取出的均是當前隊列具有最小優先級的元素。
接口設計
template <typename T>
class MinPriorityQueue
{
public:
MinPriorityQueue();
virtual ~MinPriorityQueue();
MinPriorityQueue(const MinPriorityQueue& dqA_);
MinPriorityQueue operator=(const MinPriorityQueue& dqA_);
void In(const T& nValue_);
T Out();
T Peek() const;
bool IsEmpty() const;
Heap::MinHeap<T> GetHeap() const
{
return m_mhHeap;
}
private:
Heap::MinHeap<T> m_mhHeap;
};
實現
構造
template <typename T>
MinPriorityQueue<T>::MinPriorityQueue()
{
}
拷貝構造
template <typename T>
MinPriorityQueue<T>::MinPriorityQueue(const MinPriorityQueue& mpqA_)
{
m_mhHeap = mpqA_.m_mhHeap;
}
賦值
template <typename T>
typename MinPriorityQueue<T> MinPriorityQueue<T>::operator=(const MinPriorityQueue& mpqA_)
{
if (this == &mpqA_)
{
return *this;
}
m_mhHeap = mpqA_.m_mhHeap;
return *this;
}
析構
template <typename T>
MinPriorityQueue<T>::~MinPriorityQueue()
{
}
入隊列
template <typename T>
void MinPriorityQueue<T>::In(const T& nValue_)
{
m_mhHeap.Add(nValue_);
}
出隊列
template <typename T>
typename T MinPriorityQueue<T>::Out()
{
if (IsEmpty())
{
throw "queue is empty";
}
T _nValue = m_mhHeap.Get(1);
m_mhHeap.Delete(1);
return _nValue;
}
查詢隊首元素
template <typename T>
typename T MinPriorityQueue<T>::Peek() const
{
if (IsEmpty())
{
throw "queue is empty";
}
return m_mhHeap.Get(1);
}
時間複雜度
假設隊列中元素個數爲n
構造
時間複雜度Θ(1)
拷貝構造
時間複雜度Θ(n)
賦值
時間複雜度Θ(n)
析構
時間複雜度Θ(1)
入隊列
時間複雜度O(lg(n))
出隊列
時間複雜度O(lg(n))
查詢隊首元素
時間複雜度O(1)