每日力扣:155. 最小栈 , 用双栈、双向链表分别实现

package com.sample.suncht.algo;

import java.util.Stack;

/**
 *
 * 155. 最小栈
 *
 * 设计一个支持 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.
 * 
 * 双栈、链表分别实现,链表效率比双栈高些
 *
 */
public class MinStack155 {
    /**
     * 双栈实现
     * 执行用时:122 ms
     */
    static class MinStack {
        Stack<Integer> stack = new Stack<>();
        Stack<Integer> minStack = new Stack<>();
        public MinStack() {

        }

        /**
         * 将元素 x 推入栈中
         * @param x
         */
        public void push(int x) {
            stack.push(x);

            if(minStack.size() > 0) {
                int min = minStack.peek();
                minStack.push(min > x ? x : min);
            } else {
                minStack.push(x);
            }
        }

        /**
         * 删除栈顶的元素。
         */
        public void pop() {
            stack.pop();
            minStack.pop();
        }

        /**
         * 获取栈顶元素。
         * @return
         */
        public int top() {
            return stack.peek();
        }

        public int getMin() {
            return minStack.peek();
        }
    }

    /**
     * 双向链表实现
     * 执行用时 : 101 ms,
     */
    static class MinStack2 {
        private Node top;
        private Node tail;

        public MinStack2() {
        }

        /**
         * 将元素 x 推入栈中
         * @param x
         */
        public void push(int x) {
            if(top == null && tail == null) {
                Node node = new Node(x, x);
                top = node;
                tail = node;
            } else {
                Node node = new Node(x, top.getMinValue() > x ? x : top.getMinValue());

                Node topNode = top;
                node.setPre(topNode);
                topNode.setNext(node);

                top = node;
            }
        }

        /**
         * 删除栈顶的元素。
         */
        public void pop() {
            if(top == null) {
                throw new RuntimeException("can't empty");
            }
            Node topNode = top;
            if(topNode.getPre() == null) {
                top = null;
                tail = null;
            } else if(topNode.getPre() == tail) {
                top = tail;
                top.setNext(null);
            } else {
                top = topNode.getPre();
                top.setNext(null);
            }

            topNode = null;
        }

        /**
         * 获取栈顶元素。
         * @return
         */
        public int top() {
            if(top == null) {
                throw new RuntimeException("can't empty");
            }
            return top.getValue();
        }

        public int getMin() {
            if(top == null) {
                throw new RuntimeException("can't empty");
            }
            return top.getMinValue();
        }
    }

    static class Node {
        private Node next;
        private Node pre;
        private int value;
        private int minValue;

        public Node(int value, int minValue) {
            this.value = value;
            this.minValue = minValue;
        }


        public Node getNext() {
            return next;
        }

        public void setNext(Node next) {
            this.next = next;
        }


        public int getValue() {
            return value;
        }

        public void setValue(int value) {
            this.value = value;
        }

        public int getMinValue() {
            return minValue;
        }

        public void setMinValue(int minValue) {
            this.minValue = minValue;
        }

        public Node getPre() {
            return pre;
        }

        public void setPre(Node pre) {
            this.pre = pre;
        }

    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值