zoukankan      html  css  js  c++  java
  • 设计包含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();
        }
    }
  • 相关阅读:
    JDBC存取二进制文件示例
    java多线程向数据库中加载数据
    Lucene建索引代码
    postgresql存储二进制大数据文件
    java项目使用Echarts 做柱状堆叠图,包含点击事件
    子页面获取父页面控件
    JSTL和select标签的组合使用
    log4j配置祥解
    IT项目经理应具备的十大软技能
    Spring和Struct整合的三个方法
  • 原文地址:https://www.cnblogs.com/cheng07045406/p/3071525.html
Copyright © 2011-2022 走看看