最小栈-Min Stack-leetcode

作者 : 开心源码 本文共1457个字,预计阅读时间需要4分钟 发布时间: 2022-05-13 共154人阅读

设计一个支持 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.

思路:

  1. 链式栈:
    使用两个链式栈stack,minStack ;stack正常的出栈和入栈;当stack入栈x的时候和minstack栈顶比较,假如入栈的值比minstack小,就把x在minstack中进行入栈,所以minstack保存的是较小的值;
    出栈操作:stack出栈,使用栈顶元素与minstack栈顶值比较,假如大于minstack的栈顶值即可以判断stack的最小值为minstack栈顶值;反之。
public class MinStack {    private Stack<int> stack = new Stack<int>();    private Stack<int> minStack = new Stack<int>();        /** initialize your data structure here. */    public MinStack() {    }        public void Push(int x) {       if (minStack.isEmpty() || x <= minStack.peek())            {                minStack.push(x);            }            stack.push(x);    }        public void Pop() {       if (stack.peek() == minStack.peek())            {                minStack.pop();            }            stack.pop();    }        public int Top() {         return stack.peek();    }        public int GetMin() {         return minStack.peek();            }}
  1. 顺序栈
    思路与链式栈的相同:
 private int[] s1, s2;        private int n = 10;// 栈的大小        private int count = 0;//长度        private int s2ount = 0;//长度        /** initialize your data structure here. */        public MinStack()        {            s1 = new int[n];            s2 = new int[n];        }        public void Push(int x)        {            if (n == count) return;            s1[count] = x;            if (s2ount == 0)            {                s2[0] = x;                ++s2ount;            }            else            {                int valTop = s1[count - 1];                if (valTop > x)                {                    s2[s2ount] = x;                    s2ount++;                }            }            ++count;        }        public void Pop()        {            if (count == 0) return;            int topval = s1[count - 1];            --count;            if (s2ount > 0 && topval <= s2[s2ount - 1])            {               -- s2ount;            }        }        public int Top()        {            if (count > 0) return s1[count - 1];            return -999;        }        public int GetMin()        {            if (s2ount > 0)                return s2[s2ount - 1];            return -999;        }
说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 最小栈-Min Stack-leetcode

发表回复