Implement a stack with min() function, which will return the smallest number in the stack.

It should support push, pop and min operation all in O(1) cost.

1.

用map记录所有值和出现的次数,根据map有序的特征取出最小值

class MinStack {
public:
MinStack(){
// do initialization if necessary
}

void push(int number) {
// write your code here
s.push(number);
m[number]++;
it = m.begin();
}

int pop() {
// write your code here
int res=s.top();
s.pop();

if(res==it->first){
(it->second)--;
if(it->second==0){
m.erase(it);
it=m.begin();
}
}else{
m.erase(res);
}

return res;
}

int min() {
// write your code here
return it->first;
}

private:
stack<int> s;
map<int,int> m;
map<int,int>::iterator it;
};

2.

维护一个存放每阶段最小值的栈

这个代码就很简洁,推荐

class MinStack {
public:
MinStack() {
// do initialization if necessary
}

void push(int number) {
// write your code here
S.push(number);
if(minS.empty() || number<=minS.top()){
minS.push(number);
}
}

int pop() {
// write your code here
int res=S.top();
S.pop();

if(res==minS.top()){
minS.pop();
}

return res;
}

int min() {
// write your code here
return minS.top();
}

private:
stack<int> S;
stack<int> minS;

};