关于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();
}
};
浙公网安备 33010602011771号