3.2 请设计一个栈,除pop与push方法,还支持min方法,可返回栈元素中的最小值。push、pop和min三个方法的时间复杂度必须为O(1)。
我们假设除了用一个栈s1来保存数据,还用另一个栈s2来保存这些非冗余最小值。那么, 当我们将数据压到要s1时,同时将它和s2的栈顶元素比较,如果不大于s2的栈顶元素, 那么将当前值也压入s2中。这样一来,s2中保存的就是一个阶段性最小值。 即s2中的每个值都是s1中栈底到达某个位置的最小值。那么,如果执行pop操作呢? 执行pop操作除了将s1中的栈顶元素出栈,还要将它和s2中的栈顶元素比较,如果相等, 说明这个值是栈底到栈顶的最小值,而它出栈后,最小值就不再是它了。所以, s2也要将栈顶元素出栈,新的栈顶元素将对应s1剩下元素中新的最小值。
C++实现代码:
#include<iostream> #include<stack> using namespace std; class MinStack { private: stack<int> stack1; stack<int> stack2; public: void push(int x) { if(stack1.empty()) { stack1.push(x); stack2.push(x); } if(stack1.top()<x) stack2.push(x); else { stack1.push(x); stack2.push(x); } } void pop() { if(stack1.empty()) stack2.pop(); if(stack1.top()==stack2.top()) { stack1.pop(); stack2.pop(); } else stack2.pop(); } int top() { if(stack2.empty()) return 0; else return stack2.top(); } int getMin() { if(stack1.empty()) return 0; else return stack1.empty(); } }; int main() { MinStack mystack;//StackWithMin mystack; for(int i=0; i<20; ++i) mystack.push(i); cout<<mystack.getMin()<<" "<<mystack.top()<<endl; mystack.push(-100); mystack.push(-100); cout<<mystack.getMin()<<" "<<mystack.top()<<endl; mystack.pop(); cout<<mystack.getMin()<<" "<<mystack.top()<<endl; return 0; }