实现一个最值队列,要求取最大值、最小值的时间复杂度为O(1)。以前实现最值栈比较多,又因为一个队列可以用两个栈实现,所以最传统的做法是用最值栈实现最值队列。这里用deque实现最值队列,简单高效。
template<typename T>
class queue_ext : public queue<T>
{
public:
void push(const typename queue<T>::value_type &t)
{
// Update max deque.
while (!m_dqMax.empty() && t > m_dqMax.back())
{
m_dqMax.pop_back();
}
m_dqMax.push_back(t);
// Update min deque.
while (!m_dqMin.empty() && t < m_dqMin.back())
{
m_dqMin.pop_back();
}
m_dqMin.push_back(t);
queue<T>::push(t);
}
void pop()
{
if (!m_dqMax.empty() && queue<T>::front() == m_dqMax.front())
{
m_dqMax.pop_front();
}
if (!m_dqMin.empty() && queue<T>::front() == m_dqMin.front())
{
m_dqMin.pop_front();
}
queue<T>::pop();
}
typename queue<T>::const_reference max_val() const
{
return m_dqMax.front();
}
typename queue<T>::const_reference min_val() const
{
return m_dqMin.front();
}
private:
deque<T> m_dqMin;
deque<T> m_dqMax;
};