数组、栈、队列的互相实现,都是白给题哦,链接如下:
【Java实现】剑指Offer09——用两个栈实现队列(左神基础班的白给题)
题意分析:
实现一个栈,包含返回栈中最小元素的功能
思路分析:
设计两个栈结构
data
和min
,min
栈用来存最小值,能够做到getMin
也是O(1)
,也就是从第二个栈顶弹出
data
栈每次压入一个数,去min
栈判断:如果min
空,则也压入;如果不为空,则判断min
栈顶的值
两种设计方法:
- 对齐压入:无论每次压入的数是不是最小值,
min
栈都压入一个数,这样出栈可以无脑出 - 不对齐压入:如果压入时,不是最小值,就不压入了;出栈时判断,如果两个栈顶相同,则同出,否则只有
data
栈出
需要注意!
一定要保证同步,也就是不能使一个栈出现空的情况!
情况1的代码:
class MinStack {
private Stack<Integer> data;
private Stack<Integer> min;
/** initialize your data structure here. */
public MinStack() {
data=new Stack<>();
min=new Stack<>();
}
public void push(int x) {
data.push(x);
if(min.isEmpty() || min.peek() >= x) {
min.push(x);
} else {
min.push(min.peek());
}
}
public void pop() {
if(data.isEmpty() || min.isEmpty()) {
//throw new RuntimeException("stack is empty");
return;
}
data.pop();
min.pop();
}
public int top() {
return data.peek();
}
public int min() {
return min.peek();
}
}
/**
* 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();
*/
情况2的代码:
class MinStack {
Stack<Integer> data,min;
/** initialize your data structure here. */
public MinStack() {
data=new Stack<>();
min=new Stack<>();
}
public void push(int x) {
data.push(x);
if(min.isEmpty() || min.peek() >= x) {
min.push(x);
}
}
public void pop() {
if(data.pop().equals(min.peek())) {
min.pop();
}
}
public int top() {
return data.peek();
}
public int getMin() {
return min.peek();
}
}
/**
* 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.getMin();
*/
注意:这里得到一条经验:
当出现比较时,能用equals
尽量不用==
,对于这道题,Integer
是包装类,比较的是对象的地址,当数值过大时会出现问题