思路分析
1、使用同一个栈,采取多次入栈出栈法
元素x入栈时,先push(x),然后push(min);
ps:min表示当前所在栈所有元素中的最小值
元素出栈时,则执行两次pop();
但此方法的不妥之处在于若入栈的元素数组为单调递增的,则每次需要push同一个值,此为操作冗余。
2、使用两个栈,比较入栈出栈法
使用两个栈s1、s2,s2用于压入最小值;
当元素x入栈时,将x与s2栈顶元素相比较,如果x
代码实现
template<class T>
class MinStack
{
public:
MinStack()
{}
~MinStack()
{}
void Push(const T& x)
{
if (s2.empty())
{
s1.push(x);
s2.push(x);
}
else
{
if (x < s2.top())
s2.push(x);
s1.push(x);
}
}
void Pop()
{
if (s2.empty())
{
return;
}
else
{
if (s1.top() == s2.top())
{
s2.pop();
}
s1.pop();
}
}
T& Min()
{
if (!s2.empty())
{
return s2.top();
}
}
void Print()
{
while (!s1.empty())
{
cout << s1.top() << ' ';
s1.pop();
}
cout << endl;
}
private:
stack<T> s1;
stack<T> s2;
};
测试用例
void Test3()
{
MinStack<int> s1;
s1.Push(1);
s1.Push(2);
s1.Push(3);
s1.Push(4);
s1.Push(5);
s1.Pop();
s1.Pop();
s1.Pop();
s1.Print();
cout<<s1.Min();
}