剑指offer 30.包含min函数的栈

这里写自定义目录标题

目录

题目描述

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
https://leetcode-cn.com/problems/bao-han-minhan-shu-de-zhan-lcof/

思路分析

设置两个栈s1和s2,s1正常压入弹出,s2负责存储每次要push进新元素时,该元素对应的栈里的最小值,比如向空栈s1里压入-2,最小值就是它本身,所以s2也压入-2;继续向s1里压入0,与s2的顶部元素-2比,此时的栈s1的最小值还是-2,所以向s2压入-2,而不是0;继续向s1里压入-3,与s2的顶部元素-2比,此时s1的最小值是-3,所以向s2里压入-3.

  1. push ,s1直接push,s2需拿顶部元素与待push的元素比较大小,push值较小的那一个;
  2. pop ,s1直接pop,s2也直接pop,s2pop了s1中被pop元素对应的栈的最小值;
  3. top ,返回s1.top();
  4. min ,返回s2.top();

C++代码

class MinStack {
public:
    /** initialize your data structure here. */
    stack<int> s1;
    stack<int> s2;
    MinStack() {

    }
    
    void push(int x) {
        s1.push(x);
        if(s2.empty()) s2.push(x);
        else {
            if(s2.top()<x) s2.push(s2.top());
            else s2.push(x);
        }
    }
    
    void pop() {
        if(s1.empty()) return;
        s1.pop();
        s2.pop();
    }
    
    int top() {
        if(s1.empty()) return -1;
        return s1.top();
    }
    
    int min() {
        if(s2.empty()) return -1;
        return s2.top();
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值