最值队列

    实现一个最值队列,要求取最大值、最小值的时间复杂度为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;
};
posted @ 2012-09-11 22:40  紫红的泪  阅读(393)  评论(0编辑  收藏  举报