leetCod刷题之最小值栈(Integer类型的小问题)

先看题目,从题目中找到问题:
题目描述:
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
实现一个获取最小值的栈
题目分析:
这个题目可以使用辅助的空间,因为需要在常数级别下进行操作,使用空间换取时间。使用两个栈进行操作,第一个栈用来将数据存储,第二个数据用于将最小值存入方便在常数时间获取。
push操作: 将当前的元素放入一个栈中,如果当前入栈的元素小于最小栈栈顶元素或者最小栈中没有元素那么就需要将其压入最小元素的栈
pop操作: 首先需要判断最小栈中的元素是否是第一个栈中栈顶元素,如果是那么就需要将其也弹出栈,否则只弹出第一个栈中的栈顶元素
top操作: 只获取栈顶元素
getMin操作: 只是将最小栈栈顶元素获取,不弹出

代码如下:


class MinStack {
	private Stack<Integer> stack;
	private Stack<Integer> minStack;

	/** 初始化两个栈 */
	public MinStack() {
		stack = new Stack<Integer>();
		minStack = new Stack<Integer>();
	}
	//push操作第一个栈直接压栈,最小值栈需要比较栈顶元素与当前值的大小关系
	public void push(int x) {
		stack.push(x);
		if (minStack.isEmpty())
			minStack.push(x);
		else if (minStack.peek() >= x)
			minStack.push(x);
	}
//pop先进行最小值栈元素与当前栈顶元素比较,如果值相等也将其弹出
	public void pop() {
	//该位置有一个问题,下面会分析
		if (minStack.peek().equals(stack.peek()))
			minStack.pop();
		if (!stack.isEmpty())
			stack.pop();
	}
//top操作,如果栈不为空只是将栈顶元素获取返回
	public int top() {
		if (!stack.isEmpty())
			return stack.peek();
		return 0;
	}
//getMin操作如果最小值栈不为空只是将栈顶元素获取返回
	public int getMin() {
		if (!minStack.isEmpty())
			return minStack.peek();
		return 0;
	}
}

Integer类型是int类型的包装类型,Integer类型将数值在-128~127之间的数值进行了实例化,因此使用的时候不进行实例化对象只是值传递时,相同的值指向的是同一个地址。
自己使用的过程中的错误操作:

//在此位置使用了==进行判断
if (minStack.peek()==stack.peek())
			minStack.pop();
//猜猜一下程序的运行结果
	Integer i1 = new Integer(2);
	Integer i2 = new Integer(2);
	System.out.println(i1 == i2);
	i1 = 5;
	i2 = 5;
	System.out.println(i1 == i2);
	i1 = 128;
	i2 = 128;
	System.out.println(i1 == i2);
	i1 = -128;
	i2 = -128;
	System.out.println(i1 == i2);

运行结果是:

false
true
false
true

对于Integer来说,= = 比较的是地址值,实例对象就算值相等也不是同一个地址,因此是false,对于值类型Integer数值在-128~127之间的元素,地址是相同的,可以使用 = = 进行比较,对于不在范围中的值,需要使用equals进行比较,总而言之,如果比较元素的值就是用equals方法。

public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
 }

感悟: java的知识较多,学习总是会有遗忘的,因此需要在实践中进行反复的练习,将java基础知识加固,对于以后的学习也会有所帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值