画圆的沙滩

亦简亦美

关于max queue的另一个简单写法

编程之美的第3.7节。作者使用了堆和max stack来实现。其实,第二种方法是可以借鉴到queue上面去的。实现上的差别是push的复杂度不是O(1),而pop则是O(1)的。

template<class T, class C = deque<T> >
class max_queue : queue<T, C> {
    deque<T> mq_;
public:
    const T& max() const {
        return const_cast<max_queue<T, C>*>(this)->max();
    }
    T& max() {
        if (mq_.empty()) throw "Error: Queue empty!";
        return mq_.front();
    }

    void push(const T& v) {
        queue<T, C>::push(v);

        while (!mq_.empty() && mq_.back() < v)
            mq_.pop_back();
        mq_.push_back(v);
    }
    void pop() {
        if (mq_.front() == front()) mq_.pop_front();
        queue<T, C>::pop();
    }
};

template<class T, class C = deque<T> >
class max_stack : stack<T, C> {
    stack<T, C> ms_;
public:
    const T& max() const {
        return const_cast<max_stack<T, C>*>(this)->max();
    }
    T& max() {
        if (ms_.empty()) throw "Error: Stack empty!";
        return ms_.top();
    }

    void push(const T& v) {
        stack<T, C>::push(v);

        if (ms_.empty() || ms_.top() <= v)
            ms_.push(v);
    }
    void pop() {
        if (top() == ms_.top()) ms_.pop();
        stack<T, C>::pop();
    }
};

posted on 2011-03-12 12:40  acmaru  阅读(222)  评论(0编辑  收藏  举报

导航