定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
示例:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.min(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.min(); --> 返回 -2.
方法
设置俩个栈,一个数据栈存放数据元素,另一个最小值栈,把最小的值放进去,
1、如果栈为空,直接x同时放入最小值栈和数据栈,
2 、将要放进去的元素与最小值栈的栈顶元素进行比较,如果不满足小于最小值的栈顶,仍然放的是之前的最小值栈的栈顶元素,如果小于则把这个元素放到最小值栈上去
注意(代码的实现方式比较巧妙,如果插入的x大于最小值栈的栈顶元素,那么把此时最小值栈的栈顶元素赋值给x,最终统一的把x放进去就行)
实现代码
- class MinStack {
- public:
- stack<int>_date;
- stack<int>_min;
- /** initialize your data structure here. */
- MinStack() {
- }
-
- void push(int x) {
- _date.push(x); //将数据压入数据栈
- if(_min.empty()) _min.push(x); //数据栈为空的时候直接插入
- else{
- if(x > _min.top()) //如果x大于最小栈的栈顶
- x = _min.top();
- _min.push(x); //将x push进最小的栈
- }
- }
-
- void pop() { //数据栈与最小栈同时弹出
- _date.pop();
- _min.pop();
-
- }
-
- int top() {
- return _date.top();
-
- }
-
- int min() {
- return _min.top();
- }
- };