设置两个栈,一个vbase用于存放原来的数据,一个minbase用于存放最小数据。将第一个进栈的数据同时压入两个栈中。在之后压入数据时,对于vbase,直接将数据压入即可;对于minbase,则需要比较待压入的数据与vbase顶端数据的大小,小于等于vbase顶端的数据,就将这个数据也压入minbase中。如果后来得到的值是大于当前最小栈顶的值的,那么接下来pop都会先出去,而最小栈顶的值会一直在,而当pop到最小栈顶的值时,一起出去后接下来第二小的就在pop之后最小栈的顶端了。
用stack作为基本存储结构实现:
class MinStack { public: void push(int x) { vbase.push(x); if(minbase.empty()||x<=minbase.top()) { minbase.push(x); } } void pop() { if(vbase.empty()) return; if(vbase.top()==minbase.top()) { minbase.pop(); } vbase.pop(); } int top() { return vbase.top(); } int getMin() { return minbase.top(); } private: stack<int> vbase; stack<int> minbase; };用vector作为基本存储实现:(会显示Memory Limit Exceeded)
class MinStack1 { public: void push(int x) { vbase.push_back(x); if(minbase.empty()||x<=minbase.back()) { minbase.push_back(x); } } void pop() { if(vbase.empty()) return; if(vbase.back()==minbase.back()) { minbase.pop_back(); } vbase.pop_back(); } int top() { return vbase.back(); } int getMin() { return minbase.back(); } private: vector<int> vbase; vector<int> minbase; };
原文地址:http://blog.csdn.net/yinqiaohua/article/details/43636251