有两种方法。
方法一:
利用一个栈实现。思路如下:
1.入栈时,一次入两个元素,第一次入栈,直接元素入栈;第二次入栈,直接放最小的元素入栈。这样,栈顶元素永远是最小的,Min时,直接top(),就可以得到。
2.出栈时,一次出两个元素。
具体代码如下:
template <class T>
class Stack
{
public:
void Push(T data)
{
T tmp=data;
if(!s.empty())
{
tmp=s.top();//保存栈顶元素
}
s.push(data);
if(tmp < data)
s.push(tmp);
else
s.push(data);
}
void Pop()
{
s.pop();
s.pop();
}
T& GetMin()
{
return s.top();
}
private:
stack<T> s;
};
方法二
利用两个栈实现,栈S1存元素,栈S2存最小值。
具体思路如下:
1.入栈时,元素入S1,当有较小元素时,该元素再入一次S2。
2.出栈时,直接从S1出栈,当出栈元素和S2中栈顶元素相同时,此时S2也出栈。
2.求最小值时,S2的栈顶元素就是。
具体代码如下:
template <class T>
class Stack
{
public:
void Push(T data)
{
s1.push(data);
if(s2.empty())
s2.push(data);
else
{
if(s2.top()>data)
{
s2.push(data);
}
}
}
void Pop()
{
if(s1.top()==s2.top())
s2.pop();
s1.pop();
}
T& GetMin()
{
return s2.top();
}
private:
stack<T> s1,s2;
};