先看题目,从题目中找到问题:
题目描述:
设计一个支持 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基础知识加固,对于以后的学习也会有所帮助。