题目描述:
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函树(时间复杂度应为O(1))
题解:
此题需要一个辅助栈,用来存当前最小值。
题解一
插入:
- 将结点入栈。
- 如果当前辅助栈为空,则插入结点。
- 如果插入结点小于辅助栈栈顶元素,则将当前结点插入辅助栈。
删除:
- 删除栈顶元素。
- 如果栈顶元素等于辅助栈栈顶元素,则辅助栈栈顶元素也需删除。
栈顶元素:
- 返回普通栈栈顶元素。
栈中最小元素:
- 返回辅助栈栈顶元素。
ArrayList<Integer> stack = new ArrayList<> ();
// 辅助栈
ArrayList<Integer> minstack = new ArrayList<> ();
public void push(int node) {
stack.add (node);
if(minstack.isEmpty ()){
minstack.add (node);
}
if(node < minstack.get(minstack.size ()-1)){
minstack.add (node);
}
}
public void pop() {
int val = stack.remove (stack.size () - 1);
if(val == minstack.get (minstack.size () - 1)){
minstack.remove (minstack.size () - 1);
}
}
// 求栈顶元素
public int top() {
return stack.get (stack.size ()-1);
}
// 求栈中的最小元素
public int min() {
return minstack.get (minstack.size ()-1);
}
题解二
插入:
- 将结点入栈。
- 如果当前辅助栈为空,则插入结点。
- 如果插入结点小于等于辅助栈栈顶元素,则将当前结点插入辅助栈。
- 反之将辅助栈栈顶元素再次插入辅助栈。
删除:
- 删除普通栈栈顶元素。
- 删除辅助栈栈顶元素。
public void push(int node) {
stack.add (node);
if(minstack.isEmpty ()){
minstack.add (node);
}else if(node <= minstack.get (minstack.size ()-1)){
minstack.add (node);
}else{
minstack.add (minstack.get (minstack.size ()-1));
}
}
public void pop() {
stack.remove (stack.size ()-1);
minstack.remove (minstack.size ()-1);
}