添加一個字段以保存最小值,并在Pop()和Push()期間對其進行更新。這樣,getMinimum()將為O(1),但是Pop()和Push()將不得不做更多的工作。
如果彈出最小值,則Pop()將為O(n),否則它們仍將均為O(1)。調整大小時,根據Stack實現,Push()變為O(n)。
這是一個快速實施
public sealed class MinStack {
private int MinimumValue;
private readonly Stack<int> Stack = new Stack<int>();
public int GetMinimum() {
if (IsEmpty) {
throw new InvalidOperationException("Stack is empty");
}
return MinimumValue;
}
public int Pop() {
var value = Stack.Pop();
if (value == MinimumValue) {
MinimumValue = Stack.Min();
}
return value;
}
public void Push(int value) {
if (IsEmpty || value < MinimumValue) {
MinimumValue = value;
}
Stack.Push(value);
}
private bool IsEmpty { get { return Stack.Count() == 0; } }
}