题目描述:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
输入示例:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.min(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.min(); --> 返回 -2.
代码结构:
class MinStack {
/** initialize your data structure here. */
public MinStack() {
}
public void push(int x) {
}
public void pop() {
}
public int top() {
}
public int min() {
}
}
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(x);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.min();
*/
解题思路:题目要求时间复杂度都为O(1),则不能出现排序。所以使用两个栈,主栈(stack1)用来存放所有push(x) x的值,在第一次push(x)时(即stack2为空),辅助栈(stack2)直接存放x值,因为此时没有其他值,无法比较。第二次push(x)时(即stack2不为空),将x值与stack2顶部对象相比较,若x <= stack2.peek(),则将x放入stack2中。
代码实现:
public class MinStack {
private Stack<Integer> stack1;//普通栈
private Stack<Integer> stack2;//存放每一次最小值栈
public MinStack() {
this.stack1 = new Stack<>();
this.stack2 = new Stack<>();
}
//将项目推到该堆栈的顶部
public void push(int x) {
stack1.push(x);
/*先判断栈2不为空,若先判断栈2为空,在将x放入栈2后,
栈2不为空,又会满足!stack2.isEmpty() && x <= stack2.peek()条件,会再次将x值放入栈2,造成结果错误
if (stack2.isEmpty()){
stack2.push(x);
}
if (!stack2.isEmpty() && x <= stack2.peek()){
stack2.push(x);
}*/
if (!stack2.isEmpty() && x <= stack2.peek()){
stack2.push(x);
}
//如果栈2为空,则将x放入栈2
if (stack2.isEmpty()){
stack2.push(x);
}
}
//移除此堆栈顶部的对象,并将该对象作为此函数的值返回。
public void pop() {
//如果两个栈顶元素相同,则删除。若不相同,则删除栈1的顶部元素。
/*基本型变量使用关系运算符==,引用型变量需equals()方法
引用型变量使用==指两个变量是否指向同一块内存*/
if (stack1.peek().equals(stack2.peek())){
stack1.pop();
stack2.pop();
}else {
stack1.pop();
}
}
public int top() {
return stack1.peek();
}
public int min() {
return stack2.peek();
}
public static void main(String[] args) {
MinStack minStack = new MinStack();
minStack.push(2147483646);
minStack.push(2147483646);
minStack.push(2147483647);
System.out.println(minStack.top());
minStack.pop();
System.out.println(minStack.min());
minStack.pop();
System.out.println(minStack.min());
minStack.pop();
minStack.push(2147483647);
System.out.println(minStack.top());
System.out.println(minStack.min());
minStack.push(-2147483648);
System.out.println(minStack.top());
System.out.println(minStack.min());
minStack.pop();
System.out.println(minStack.min());
}
}
总结相关知识点: