• 设计包含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();
        }
    }
  • 相关阅读:
    Linux 配置gitee
    Linux C errno出错处理
    Linux C进程时间:墙上时钟时间,用户CPU时间,系统CPU时钟时间
    编译错误: 对‘aio_read’未定义的引用
    Linux 异步IO(AIO)
    Linux getaddrinfo获得本机ip地址为何127.0.1.1?
    Linux 文件截断的几种方式
    如何创建守护进程?
    守护进程, 协同进程, 僵尸进程, 孤儿进程概念理解
    对线程安全, 可重入函数, 异步安全的理解
  • 原文地址:https://www.cnblogs.com/cheng07045406/p/3071525.html
Copyright © 2020-2023  润新知