题目:定义"栈"的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数,在该栈中,调用min,push,pop的时间复杂度都是O(1)。
分析:用双栈实现,一个是正常的数据栈,一个是存当前数据栈中最小元素的栈
template <class T>
class Min_Stack
{
private:
stack<T> data_stack;//数据栈
stack<T> min_stack;//最小栈
public:
//入栈。首先入栈要入到数据栈中。最小栈入栈规则如下:
//(1)最小栈为空,直接给最小栈入栈(2)新入的元素<最小栈的元素
//则直接给最小栈入栈,否则再次将最小栈元素栈顶元素入一次栈
//即最小栈元素个数与数据中元素个数相同,并且最小栈栈顶永远
//存的是数据栈当前最小值。
void push(const T& x)
{
data_stack.push(x);
if (min_stack.empty() || x < min_stack.top())
{
min_stack.push(x);
}
else
{
min_stack.push(min_stack.top());
}
}
//出栈。数据栈和最小值同时出栈
void pop()
{
assert(data_stack.size() > 0 && min_stack.size() > 0);
data_stack.pop();
min_stack.pop();
}
//取最小元素。直接取最小栈栈顶元素
T& min()
{
assert(data_stack.size() > 0 && min_stack.size() > 0);
return min_stack.top();
}
};