[图解]最小栈JAVA实现

题目描述

设计一个支持 push,pop,top 操作,并能检索到最小元素的栈,

时间复杂度o(1)

push(x) 将元素x推入栈中

pop() 删除栈顶的元素

top() 取栈顶元素

getMin()  检索栈中的最小元素

 

图解法

根据这个思路立刻可以得到如下的错误代码

public void pushError(int x) {
    	int Min=0;
    	//如果有负数,赋予初值时赋予一个极小值就可以了
    	if(normal.empty()) {
    		normal.push(x);
    		min.push(x);
    		Min=x;
    	}
    	else {
    		if(x<=Min) {
    			normal.push(x);
    			min.push(x);
    			Min=x;
    		}
    		else {
    			normal.push(x);
    			min.push(Min);
    		}
    	}
    }

哪里出现了问题呢?是的刚刚图解的时候没有考虑到这个Min的值,由于每次重新调用一遍方法,无法记录前一次Min

的值,做出 

如下调整

下面对代码进行改进,处理Min的问题
    //总结:如何解决,需要调用前一次遍历Min的值,与x进行比较,却由于每次方法运行完毕都会销毁,无法保存Min的值
    //解决方法:采用每一次先记录第二个栈min.peek()的值,再用之前的方法进行比较
    public void push(int x) {
    	//因为每一次normal都需要push,就调整到最前面
        normal.push(x);
        if (min.empty()) {
        //min.empty的情况就是上面图画的第一种遍历情况,min的栈中push();
        	min.push(x);
        } else {
        //分为两种情况讨论,如果给定值小,就push给定值,如果给定值大,就push(Min)
        	//首先记录Min的值,为了区别上一个错误示范,这里用m来表示最小值的记录
            int m = min.peek();
            if (x <= m) {
                min.push(x);
            } else {
                min.push(m);
            }
        }
    }

完整代码如下所示 

package test_821;
import java.util.Stack;

 class MinStack {
    Stack<Integer> normal = new Stack<>();
    Stack<Integer> min = new Stack<>();
    public MinStack() {}
    //根据图片你可能会写出这样一个白话文
    //显然直接这么写有一个问题就是Min的值每次都会被销毁
    public void pushError(int x) {
    	int Min=0;
    	//如果有负数,赋予初值时赋予一个极小值就可以了
    	if(normal.empty()) {
    		normal.push(x);
    		min.push(x);
    		Min=x;
    	}
    	else {
    		if(x<=Min) {
    			normal.push(x);
    			min.push(x);
    			Min=x;
    		}
    		else {
    			normal.push(x);
    			min.push(Min);
    		}
    	}
    }
 //下面对代码进行改进,处理Min的问题
    //总结:如何解决,需要调用前一次遍历Min的值,与x进行比较,却由于每次方法运行完毕都会销毁,无法保存Min的值
    //解决方法:采用每一次先记录第二个栈min.peek()的值,再用之前的方法进行比较
    public void push(int x) {
    	//因为每一次normal都需要push,就调整到最前面
        normal.push(x);
        if (min.empty()) {
        //min.empty的情况就是上面图画的第一种遍历情况,min的栈中push();
        	min.push(x);
        } else {
        //分为两种情况讨论,如果给定值小,就push给定值,如果给定值大,就push(Min)
        	//首先记录Min的值,为了区别上一个错误示范,这里用m来表示最小值的记录
            int m = min.peek();
            if (x <= m) {
                min.push(x);
            } else {
                min.push(m);
            }
        }
    }

    public void pop() {
        normal.pop();
        min.pop();
    }
    public int top() {
        return normal.peek();
    }
    public int getMin() {
        return min.peek();
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值