类定义如下:
#pragma once
#include <queue>
#include <deque>
#include <assert.h>
template <typename T> class QueueWithMin
{
public:
QueueWithMin(void) {}
virtual ~QueueWithMin(void) {}
T& front(void);
const T& front(void) const;
void push(const T& value);
void pop(void);
const T& Max(void) const;
bool empty() const;
size_t size() const;
private:
std::queue<T> m_data;
std::deque<T> m_max;
};
template <typename T> void QueueWithMin<T>::push(const T& value)
{
m_data.push(value);
if(m_max.size() == 0 )
m_max.push_back(value);
else if( value<=m_max.back()){
m_max.push_back(value);
}
else {
while(m_max.size()!=0 && value>=m_max.back()){ //每次都要判断长度,避免越界
m_max.pop_back();
}
m_max.push_back(value);
}
}
template <typename T> void QueueWithMin<T>::pop()
{
assert(m_data.size() > 0 && m_max.size() > 0);
if(m_data.front()==m_max.front()){
m_max.pop_front();
}
m_data.pop();
}
template <typename T> const T& QueueWithMin<T>::Max() const
{
assert(m_data.size() > 0 && m_max.size() > 0);
return m_max.front();
}
template <typename T> T& QueueWithMin<T>::front()
{
return m_data.front();
}
template <typename T> const T& QueueWithMin<T>::front() const
{
return m_data.front();
}
template <typename T> bool QueueWithMin<T>::empty() const
{
return m_data.empty();
}
template <typename T> size_t QueueWithMin<T>::size() const
{
return m_data.size();
}