2.设计包含min 函数的栈。
定义栈的数据结构,要求添加一个min 函数,能够得到栈的最小元素。
定义栈的数据结构,要求添加一个min 函数,能够得到栈的最小元素。
要求函数min、push 以及pop 的时间复杂度都是O(1)。
思路:栈只支持栈顶的操作,要证getMin操作的O(1)复杂度,需要一个辅助栈保存当前最小元素min。这样设计这个辅助栈,数据栈进行push和pop操作的同时,辅助栈也进行push和pop操作,辅助栈栈顶存储的是数据栈内所有元素的最小值。因此在数据栈每次push时,如果push的元素小于辅助栈栈顶元素,则将该元素同时push到辅助栈,否则将辅助栈的栈顶元素push到辅助栈。
通过上面的操作保证了辅助栈栈顶元素在任何时候都是数据栈中的最小值,获取栈的最小元素时直接去辅助栈栈顶元素即可。
采用C++实现:
namespace MS100P_2
{
template<class T>
class MinStack
{
public:
void push(T data)
{
sData.push(data);
if (data < sData.top())
sAsistance.push(data);
else
sAsistance.push(sAsistance.top());
}
T top()
{
if (sData.empty())
return sData.top();
else
return NULL;
}
void pop()
{
if (sData.empty())
return;
sData.pop();
sAsistance.pop();
}
T getMin()
{
return sAsistance.top();
}
private:
stack<T> sData;
stack<T> sAsistance;
};
}