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.
-
思路:参考剑指offer的面试题21:包含min函数的栈
-
分别定义两个栈,一个数据栈,一个最小值栈,这里我们运用vector容器来模拟。在每一次push过程中,数据栈中都会压入该数据,如果该数小于最小值栈顶元素,则压入,否则将最小值栈顶元素再压入最小值栈。每一次pop的过程,分别从两个栈弹出栈顶元素
-
class MinStack { private: int count; vector<long long> num; vector<long long> min; public: /** initialize your data structure here. */ MinStack() { count = 0; } void push(int x) { num.push_back(x); if(count == 0) min.push_back(x); else { long long new_min = min[count - 1] < x ? min[count - 1] : x; min.push_back(new_min); } ++count; } void pop() { num.pop_back(); min.pop_back(); --count; } int top() { if(count > 0) return num[count - 1]; else return false; } int getMin() { if(count > 0) return min[count - 1]; else return false; } }; /** * Your MinStack object will be instantiated and called as such: * MinStack obj = new MinStack(); * obj.push(x); * obj.pop(); * int param_3 = obj.top(); * int param_4 = obj.getMin(); */