关于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(); } };