获取栈中最小值的最小栈问题

最小栈问题

问题概述:
获取一个栈中最小的元素
问题本质:
栈的灵活运用
思路:
对于一个栈,采用标记位的方法记录栈中的最小值。如果新入栈的元素小于当前栈中保存的最小值,就将栈的最小值替换为新入栈的元素。注意需要考虑出栈的情况,如果当前最小值出栈,那么当前最小值的前一个最小值应该为当前栈的最小值。故:需要将栈的最小值的标记位修改为一个辅助栈,存储栈中的所有最小值。
例图分析:
在这里插入图片描述

package algorithm;

import java.util.Iterator;

public class MinStack<T extends Comparable<T>> {
    //主栈
    private Node MainStack;
    //存储最小值的辅助栈
    private Node MinStack;
    private int N;
    private class Node{
        private T element;
        private Node next;

        public Node(T element, Node next) {
            this.element = element;
            this.next = next;
        }
    }

    public MinStack(){
        MainStack = new Node(null,null);
        MinStack = new Node(null,null);
    }
    public void push(T element){
        Node NewNode = new Node(element,null);
        NewNode.next = MainStack.next;
        MainStack.next = NewNode;
        N++;
        //如果辅助栈为空,或当前栈内最小值大于新入栈元素
        if(MinStackisEmpty() || getmin().compareTo(element)>0){
            Node MinNode = new Node(element,null);
            MinNode.next = MinStack.next;
            MinStack.next = MinNode;
        }

    }
    private Boolean MinStackisEmpty(){
        return MinStack.next==null;
    }
    public T pop(){
        Node node = MainStack.next;
        MainStack.next = node.next;
        if(node.element == MinStack.next.element){
            MinStack.next = MinStack.next.next;
        }
        return node.element;
    }
    public T getmin(){
        return MinStack.next.element;
    }
    public static void main(String[] args) {
        MinStack<String> stack = new MinStack<>();
        stack.push("E");
        stack.push("F");
        stack.push("G");
        stack.push("D");
        System.out.println(stack.getmin());
        stack.pop();
        System.out.println(stack.getmin());
    }
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值