【leetcode】最小栈c++

该博客介绍了一个数据结构问题,即如何设计一个栈,除了支持push、pop、top基本操作外,还能在常数时间内获取栈中的最小元素。作者通过创建两个栈,一个用于存储所有元素,另一个用于存储最小值,实现了这一功能。在push操作中,如果新元素小于或等于b栈顶元素,则将其压入b栈。在pop操作中,如果a栈顶元素与b栈顶元素相同,则b栈也出栈。这样,b栈的栈顶始终为当前栈中的最小元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。

push(x) —— 将元素 x 推入栈中。
pop() —— 删除栈顶的元素。
top() —— 获取栈顶元素。
getMin() —— 检索栈中的最小元素。

示例:

输入:
[“MinStack”,“push”,“push”,“push”,“getMin”,“pop”,“top”,“getMin”]
[[],[-2],[0],[-3],[],[],[],[]]

输出:
[null,null,null,null,-3,null,0,-2]

解释:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.getMin(); --> 返回 -2.

代码:

#include<stack>
class MinStack {
public:
    /** initialize your data structure here. */
    stack<int> a;//存输入的数字的正常栈
    stack<int> b;//栈顶存放每次变化后的最小值
    MinStack() {
        
    }
    
    void push(int val) {
        a.push(val);
        if(b.empty() || b.top()>=val)  //压入的数比栈b顶数还小,压入b中;或当b为空时。b.empty() 必须写在前
        b.push(val);
    }

    
    void pop() {
        if(a.top()==b.top())b.pop(); //当b栈顶元素和a即将出栈的栈顶元素相同,b中出栈,不再作为最小值
        a.pop();
    }
    
    int top() {
        return a.top();
    }
    
    int getMin() {
        return b.top();
    }
};

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack* obj = new MinStack();
 * obj->push(val);
 * obj->pop();
 * int param_3 = obj->top();
 * int param_4 = obj->getMin();
 */

使用辅助栈

题目要求常数时间取得已输入的栈的最小值,只有数据结构栈中取栈顶元素的速度是常数,想到用栈保存当前已输入数字中的最小值,每次都让最小值处于栈顶

push():
入栈时,栈a正常入栈;栈b先比较入栈数字和栈顶元素大小,若入栈数字比栈顶小,则入b栈,新入的数字为栈顶。

pop():
出栈时,栈a正常出栈;栈b考虑是否栈顶元素和a即将出栈的栈顶元素相同,若相同,b栈顶即将不在a中,不能再作为最小值,b出栈,否则b不出栈。

注意:
&&和||都有短路效应,例如A||B||C,若A已经满足则不再向后判断。在判断是否要把数字压入b栈时if(b.empty() || b.top()>=val),必须把b.empty()写在前,否则将先判断val和b.top()的大小,若此时b栈为空,则判断读取空指针,无效,程序将报错

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值