题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。
分析:这是google的一道面试题。 后来想到有个改进就是并不要最小栈和原始一样大,只有当前压入栈比之前的小,才更新,否则不需要压入;而弹出栈时,则当等于最小栈顶,最小栈才出栈。
/* 设计min函数的栈: 利用两个栈,来实现0(1)的输出最小值min */ #include <iostream> using namespace std; #include <stack> #include <assert.h> template <typename T> class CStack_Min { public: CStack_Min(){}; ~CStack_Min(){}; public: void pop(); void push(T indata); T min(); T top()const; int stack_size(); private: stack<T> m_data; stack<T> min_data; }; template <typename T> void CStack_Min<T>::push(T indata) { m_data.push(indata); if(m_data.size()==1) { min_data.push(indata); return ; } if(min_data.top() > indata) min_data.push(indata); //记录最小值 else min_data.push(min_data.top()); } template <typename T> T CStack_Min<T>::top()const { return m_data.top(); } template <typename T> void CStack_Min<T>::pop() { assert(m_data.size()>0); assert(min_data.size()>0); min_data.pop(); m_data.pop(); } template <typename T> int CStack_Min<T> ::stack_size() { return m_data.size(); } template <typename T> T CStack_Min<T> :: min() { assert(m_data.size()>0); assert(min_data.size()>0); return min_data.top(); }
测试代码:
int main() { CStack_Min<int> min_stack; min_stack.push(6); min_stack.push(3); min_stack.push(4); min_stack.push(1); cout<"============\n"; while (min_stack.stack_size()>0) { cout<<"stack_data: "<<min_stack.top()<<endl; cout<<"min:"<<min_stack.min()<<endl; min_stack.pop(); } }