現在我們要求實現一種特殊的棧結構:最小棧;
它滿足如下要求:
1. 能夠在O(1)時間複雜度實現入棧/出棧操作
2. 能夠在O(1)時間複雜度取出棧中最小的元素
/**
* 最小棧的實現,此數據結構的實現必須滿足:
* 1. 能夠在O(1)時間複雜度實現入棧/出棧操作
* 2. 能夠在O(1)時間複雜度取出棧中最小的元素
*/
public interface MinStack {
/**
* O(1)時間複雜度取出棧中最小元素
* @return
*/
int getMin();
/**
* O(1)時間複雜度入棧
* @param e
*/
void push(int e);
/**
* O(1)時間複雜度出棧
* @return
*/
int pop();
}
我們藉助一個輔助棧,用來保存一段區間覆蓋上的最小值。這個 區間覆蓋 的含義需要細細體會。
最小棧的實現
public class MinStackImpl implements MinStack {
private LinkedList<Integer> mainStack = new LinkedList<>();
/**
* 棧頂存放的是當前main的棧頂一段區間的最小值
*/
private LinkedList<Integer> minStack = new LinkedList<>();
@Override
public int getMin() {
if(minStack.isEmpty()) {
throw new RuntimeException("Stack is empty...");
}
return minStack.peek();
}
@Override
public void push(int e) {
mainStack.push(e);
if(minStack.isEmpty() || e <= minStack.peek()) {
minStack.push(e);
}
}
@Override
public int pop() {
int popElem = mainStack.pop();
if(popElem == minStack.peek()) {
minStack.pop();
}
return popElem;
}
public static void main(String[] args) {
MinStack stack = new MinStackImpl();
stack.push(4);
stack.push(9);
stack.push(7);
stack.push(3);
stack.push(8);
stack.push(5);
System.out.println(stack.getMin());
stack.pop();
stack.pop();
stack.pop();
System.out.println(stack.getMin());
}
}