设计包含min函数的栈,要求复杂度为o(1)
c++的标准模版一直没有仔细看过,今天用到了set、vector,比写一个c函数要方便许多
set是集合,关键的一个操作set::insert(),如果当前key不在set中,则加入,可以方便生成一个无重复值的集合
vector可以实现栈的操作,vector::back()返回最后的一个元素,与*(vector::end()-1)相同,*vector::begin()是最初的那个元素;vector::push_back和pop_back()分别入栈和出栈
借助vector,实现一个辅助栈,当Stack每push一个key时,辅助栈就将当前值与栈顶元素指向的值比较,如果小于它,刚辅助栈压入top,否则压入vector::back()
#include<iostream> #include<vector> using namespace std; const int MAXSIZE=100; template <typename T> class Stack{ private: T m_data[MAXSIZE]; int m_top; vector <int>m_stack; public: Stack(){m_top=-1;} void Push(T data) { m_data[++m_top]=data; if(m_top==0) m_stack.push_back(0); else if(data<m_data[m_stack.back()]) m_stack.push_back(m_top); //压入top else m_stack.push_back(m_stack.back()); //或者压入上一个位置 } T Pop(){m_stack.pop_back();return m_data[m_top--];} T Min(){return m_data[m_stack.back()];} void Print() { vector<int>::iterator j; cout<<m_stack.back()<<endl; cout<<*m_stack.begin()<<endl; cout<<*(m_stack.end()-1)<<endl; for(j=m_stack.begin();j!=m_stack.end();j++) cout<<*j<<" "; cout<<endl; } }; int main() { Stack<int> s; int arTest[]={1,-2,3,5,4,-1,9}; for(int i=0;i<7;i++) s.Push(arTest[i]); s.Print(); int min=s.Min(); cout<<min<<endl; return 0; }