所谓最小栈,即是在栈中实现一个min()函数,来保证每次弹栈的时候得到的都是当前栈中的最小值。思考分析后可知,要解决此题,实现一个最小栈,就需要一个辅助栈来辅助主栈完成任务。
假设我们要压栈的数据为3、4、2、1、0,其中在1压栈之后,进行两次弹栈操作。
思路是这样的:首先我们需要两个栈,一个数据栈s1,一个辅助栈s2。先往空的数据栈s1中压入元素3,显然现在的3是最小值,所以我们也把它压入到辅助栈s2中。

接下来我们将元素4入栈s1,发现此时的元素4比辅助栈的栈顶元素3要小,所以我们不让4入辅助栈,而是让当前元素和辅助栈的栈顶元素中最小的入栈,即让3再次入栈s2。

接下来是元素2入栈。压入栈s1中,对于s2来说,当前元素2比栈顶元素小,所以让2入栈s2中。

对于元素1的入栈,操作方式同上。

接下来,弹栈操作。即对主栈中的元素进行弹栈操作,由于是最小栈,所以弹出的元素应该为1。那就弹出主栈中的栈顶元素,同时也弹出辅助栈中的栈顶元素,即此时弹出的元素为1,符合最小栈的要求。

接下来再进行一次弹栈操作,弹出元素2。

入栈元素1。

弹栈,弹出元素1。

继续弹栈。需要注意的是,此时主栈中的最小值是3,而其位于栈底,不能直接弹出。但是辅助栈的栈顶元素是3,也就是说,辅助栈中的栈顶元素一直都是当前主栈中元素的最小值。所以弹出。之后对3的弹栈也一样。
接下来,我们用代码完成这一操作,包括压栈、弹栈和获取最小值。
stack<int> s1; //主栈,数据栈
stack<int> s2; //辅助栈,最小栈
//压栈
void push(int x)
{
s1.push(x);
if(s1.size() == 0 || x < s2.top())
{
s2.push(x);
}
else
{
s2.push(s2.top);
}
}
//弹栈
void pop()
{
if(s1.size() > 0 && s2.size() > 0)
{
s1.pop();
s2.pop();
}
}
//获取最小值
int GetMin()
{
if(s1.size > 0 && s2.size() > 0)
{
return s2.top();
}
}
1458

被折叠的 条评论
为什么被折叠?



