• 设计包含min函数的栈


    题目:定义栈的数据结构,要求添加一个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();
        }
    }
  • 相关阅读:
    树状数组
    POJ 1178 -- 国王和骑士
    read
    优先队列
    统计八连块
    1579、Function Run Fun(记忆化搜索)
    5488: 石子归并II (区间DP+环形DP+四边形不等式优化)
    4797: 能量项链(区间DP,环形DP)
    5936 桃子的矩阵快速幂
    Happy Necklace(找规律+矩阵快速幂)
  • 原文地址:https://www.cnblogs.com/cheng07045406/p/3071525.html
Copyright © 2020-2023  润新知