设计一个栈

题目

  设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。
   • push(x) -- 将元素 x 推入栈中。
   • pop() -- 删除栈顶的元素。
   • top() -- 获取栈顶元素。
   • getMin() -- 检索栈中的最小元素。

示例

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

思路

请参考设计一getMin的栈

代码演示

package com.itz.stackAndQueue;

import java.util.Stack;

/**
 * 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。
 * <p>
 * push(x) -- 将元素 x 推入栈中。
 * pop() -- 删除栈顶的元素。
 * top() -- 获取栈顶元素。
 * getMin() -- 检索栈中的最小元素。
 * 示例:
 * <p>
 * MinStack minStack = new MinStack();
 * minStack.push(-2);
 * minStack.push(0);
 * minStack.push(-3);
 * minStack.getMin();   --> 返回 -3.
 * minStack.pop();
 * minStack.top();      --> 返回 0.
 * minStack.getMin();   --> 返回 -2.
 * <p>
 * 来源:力扣(LeetCode)
 * 链接:https://leetcode-cn.com/problems/min-stack
 * 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
 */

/**
 * 执行用时 :
 * 8 ms
 * , 在所有 java 提交中击败了
 * 100.00%
 * 的用户
 * 内存消耗 :
 * 40.2 MB
 * , 在所有 java 提交中击败了
 * 95.58%
 * 的用户
 */
public class MinStack {

    private Stack<Integer> stackData;
    private Stack<Integer> stackMin;

    /**
     * initialize your data structure here.
     */
    public MinStack() {
        this.stackData = new Stack<>();
        this.stackMin = new Stack<>();
    }

    public void push(int x) {
        if (this.stackMin.isEmpty()) {
            this.stackMin.push(x);
        } else if (x <= this.getMin()) {
            this.stackMin.push(x);
        }
        this.stackData.push(x);
    }

    public void pop() {
        if (this.stackData.isEmpty()) {
            throw new RuntimeException("你没有添加数据");
        }

        if (stackData.pop() == this.getMin()) {
            this.stackMin.pop();
        }
    }

    public int top() {

        return stackData.peek();
    }

    public int getMin() {
        if (this.stackMin.isEmpty()) {
            throw new RuntimeException("你没有添加数据");
        }
        return this.stackMin.peek();
    }
}

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

总结:

本题有两种方案设计一getMin的栈 两种方案的时间复杂度和空间复杂度都分别是O(1)、O(n),只是方法一:在压入的时候稍微省空间、但弹出的时候稍微费时间,方案二 在压入的时候稍微费空间、但弹出的时候稍微省时间。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • java可以用数组和ArrayList两种实现我们选择了较为简单的ArrayList来实现 javascriptj...
    Ching_Lee阅读 149评论 0 0
  • 题目 难度:★☆☆☆☆类型:栈 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。...
    玖月晴阅读 1,732评论 1 0
  • 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。push(x) -- 将元素 x...
    genggejianyi阅读 197评论 0 0
  • 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。 push(x) -- 将元素 ...
    小白学编程阅读 1,485评论 2 1
  • 在这篇文章里,我们来实现自定义的链式栈。首先我们来看看链式栈的结构及操作定义。 链式栈结构定义 首先,新建两个文件...
    我叫卡卡算了阅读 878评论 0 2