题目:
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min、push及pop的时间复杂度都是O(1)
思路:
用双栈:
一个数据栈是用来存push到栈里面的数据,另一个栈(辅助栈)是用来存当前栈中的最小值,如果新加入的值比辅助栈中最顶端的值小,那么辅助栈中将这个值push进去,如果新加入的值没有辅助栈中最顶端的值小,那么辅助栈就将自己当前栈中最小值再push进去,保证辅助栈最顶端的值时时刻刻是数据栈中的最小值。
代码:
Stack<Integer> m_data = new Stack<>();
Stack<Integer> m_min = new Stack<>();
public void push(int value) {
m_data.push(value);
if (m_min.size() == 0 || value < m_min.peek()) {
m_min.push(value);
} else {
m_min.push(m_min.peek());
}
}
public void pop() {
m_data.pop();
m_min.pop();
}
public int top() {
return m_data.peek();
}
public int min() {
return m_min.peek();
}