设计包含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;
}

 

    

  

posted on 2012-09-25 14:40  CodeAnt  阅读(278)  评论(0编辑  收藏  举报