最小栈

所谓最小栈,即是在栈中实现一个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();
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值