定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数,在该栈中,调用 min、pop、push 的时间复杂度都是 O(1) 。
思路:定义一个辅助栈,用以保存当前栈的最小值,需保持辅助栈和当前栈的高度一致,以实现二者push、pop的同步;
(1)栈的数据结构定义
template<typename T> class StackWithMin { public: void push(const T& value); void pop(); const T& min(); private: stack<T> data; stack<T> tmp; };
- (2)成员函数实现
template<typename T>
void StackWithMin<T>::push(const T& value)
{
data.push(value);
if (tmp.empty() || value < tmp.top())
tmp.push(value);
else
tmp.push(tmp.top());
}
template<typename T>
void StackWithMin<T>::pop()
{
assert(!data.empty());
data.pop();
tmp.pop();
}
template<typename T>
const T& StackWithMin<T>::min() const
{
assert(!tmp.empty());
return tmp.top();
}