Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.
push(x)
-- Push element x onto stack.
pop()
-- Removes the element on top of the stack.
top()
-- Get the top element.
getMin()
-- Retrieve the minimum element in the stack.
Example:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> Returns -3.
minStack.pop();
minStack.top(); --> Returns 0.
minStack.getMin(); --> Returns -2.
Solution
struct MinNode {
let val: Int
let min: Int
}
class MinStack {
private var stack: [MinNode] = []
/** initialize your data structure here. */
init() {
}
func push(_ x: Int) {
guard !stack.isEmpty else {
stack.append(MinNode(val: x, min: x))
return
}
let top = self.stack.last!
stack.append(MinNode(val: x, min: min(top.min, x)))
}
func pop() {
stack.removeLast()
}
func top() -> Int {
return stack.last!.val
}
func getMin() -> Int {
return stack.last!.min
}
}