155. Min Stack
题目链接:https://leetcode.com/problems/min-stack/description/
Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.
- push(x) – Push element x onto stack.
- pop() – Removes the element on top of the stack.
- top() – Get the top element.
- getMin() – Retrieve the minimum element in the stack.
Example:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> Returns -3.
minStack.pop();
minStack.top(); --> Returns 0.
minStack.getMin(); --> Returns -2.
方法一:private Stack<Integer> stack=new Stack<Integer>();
private Stack<Integer> minstack=new Stack<Integer>();
public void push(int x) {
if(minstack.isEmpty()||x<=minstack.peek())
minstack.push(x);
stack.push(x);
}
public void pop() {
if(stack.peek().equals(minstack.peek())) //此处使用==号不行
minstack.pop();
stack.pop();
}
public int top() {
return stack.peek();
}
public int getMin() {
return minstack.peek();
}
/*
* 1.对于基本数据类型:equals和"=="的区别
* (1)"=="比较的是两个变量的数值是否相等;
* (2)"equals"不能用于基本数据类型,只能用于对象数据类型,必须使用对应的包装类。
* 2.对于对象变量:equals和"=="的区别
* (1)“=="比较的是对象变量(存放于栈内存)存放对象的堆内存地址,比较的是地址;
* (2)“equals”比较的是两个对象的内容是否相同。
* 3.java类都继承Object超类,在Object类中equals和"=="是一样的,没有区别,而在String,Integer等类中重写了equals方法,才使得equals和“==不同”
*所以,当自己创建一个类时,自动继承了Object的equals方法,要想实现不同的比较,必须重写equals方法。
* */
方法2:使用ArraList实现栈
ArrayList<Integer> stack=new ArrayList<Integer>();
ArrayList<Integer> minstack=new ArrayList<Integer>();
public void push(int x){
stack.add(x);
if(minstack.isEmpty()||x<=minstack.get(minstack.size()-1))
minstack.add(x);
}
public void pop(int x){
if(stack.isEmpty())
return;
int temp=stack.remove(stack.size()-1); //移除stack的栈顶元素
if(!minstack.isEmpty()&&temp==minstack.get(minstack.size()-1))
minstack.remove(minstack.size()-1);
}
public int top(int x){
if(!stack.isEmpty())
return stack.get(stack.size()-1);
return 0;
}
public int getMin() {
if(!minstack.isEmpty())
return minstack.get(minstack.size()-1);
return 0;
}