Q; How would you design a stack which, in addition to push and pop, also has a function min which returns the minimum element? Push, pop and min should all operate in O(1) time.
A: 用两个栈s1, s2, s1正常push, pop,. s2保存非递增序列,即当元素值小于等于s2.top()的时候,才会push进去
#include <iostream>
#include <stack>
using namespace std;
const int MAX_INT = ~(1<<31);
class stackWithMin{
private:
stack<int> s1;
stack<int> s2;
public:
void push(int val) {
s1.push(val);
if (s2.empty() || val <= s2.top()) {
s2.push(val);
}
}
void pop() {
if (s1.top() == s2.top()) {
s2.pop();
}
s1.pop();
}
int top() {
return s1.top();
}
bool empty() {
return s1.empty();
}
int min() {
if (s2.empty()) {
return MAX_INT;
}
return s2.top();
}
};
int main(){
stackWithMin mystack;
for(int i=0; i<20; ++i)
mystack.push(i);
cout<<mystack.min()<<" "<<mystack.top()<<endl;
mystack.push(-100);
mystack.push(-100);
cout<<mystack.min()<<" "<<mystack.top()<<endl;
mystack.pop();
cout<<mystack.min()<<" "<<mystack.top()<<endl;
return 0;
}