• 设计包含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();
        }
    }
  • 相关阅读:
    dynamic和匿名对象
    生成1亿个不重复的8位随机整数
    Storage,Memcache,KVDB都是存储服务,如何区分何时用何种服务
    深入理解jQuery中$.get、$.post、$.getJSON和$.ajax的用法
    常用工具
    数字格式化,保留一位小数,无小数用0补充
    学习某些API的方法
    程序员的学习方法(程序员必看)【风中叶老师讲述】
    html的dtd声明
    数据库管理工具navicat基本使用方法——以MySql为例
  • 原文地址:https://www.cnblogs.com/cheng07045406/p/3071525.html
Copyright © 2020-2023  润新知