• 包含min函数的栈 【微软面试100题 第二题】


    题目要求:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min、push及pop的时间复杂度都是O(1).

    参考题目:剑指offer第21题.

    题目分析:

      1.采用面向对象思想,定义类StackWithMin,包含min、push和pop等方法;

      2.StackWithMin类中包含两个栈:一个数据栈,一个辅助栈。数据栈中是每次压入的实际数据,辅助栈中是对应数据栈的当前结点的最小值。

        解释:假设数据栈为stackdata,辅助栈为stackmin;令压栈数据依次为5-3-4-1-2;

           则压入5:stackdata:5 , stackmin:5

              压入3:----->stackdata:5-3 , stackmin:5-3

                压入4:----->stackdata:5-3-4 , stackmin:5-3-3

                  压入1:----->stackdata:5-3-4-1 , stackmin:5-3-3-1

                     压入2:----->stackdata:5-3-4-1-2, stackmin:5-3-4-1-1

        stackdata即为压入的实际数据,stackmin中每次压入的数据和之前stackmin中的输入比较,如果比之前的小则压入当前,如果比之前的大则压入之前的数据。

    #include <iostream>
    #include <stack>
    #include <cassert>
    
    using namespace std;
    
    template<class T>
    class stackWithMin
    {
    public:
        stackWithMin(){}
        ~stackWithMin(){}
        void push(const T& value);
        void pop();
        const T& min() const;
        void printStack();
    private:
        stack<T> stackData;
        stack<T> stackMin;
    };
    template<class T>
    void stackWithMin<T>::push(const T& value)
    {
        stackData.push(value);
    
        //辅助栈为空或者压入的元素小于辅助栈的栈顶元素,则压入当前元素;否则压入栈顶元素
        if(stackMin.empty() || stackMin.top()>value)
            stackMin.push(value);
        else
            stackMin.push(stackMin.top());
    }
    template<class T>
    void stackWithMin<T>::pop()
    {
        assert(stackData.size()>0 && stackMin.size()>0);
    
        stackData.pop();
        stackMin.pop();
    }
    template<class T>
    const T& stackWithMin<T>::min() const
    {
        assert(stackData.size()>0 && stackMin.size()>0);
    
        return stackMin.top();
    }
    template<class T>
    void stackWithMin<T>::printStack()
    {
        stack<T> tmp;
        
        cout << "当前栈中元素有:";
        while(stackData.size())
        {
            tmp.push(stackData.top());
            stackData.pop();
        }
        
        while(tmp.size())
        {
            stackData.push(tmp.top());
            cout << tmp.top();
            tmp.pop();
        }
        cout << endl;
    }
    int main(void)
    {
        stackWithMin<int> minStack;
    
        minStack.push(5);
        minStack.printStack();
        cout << "最小元素为:" << minStack.min() << endl;
    
        minStack.push(3);
        minStack.printStack();
        cout << "最小元素为:" << minStack.min() << endl;
    
        minStack.push(4);
        minStack.printStack();
        cout << "最小元素为:" << minStack.min() << endl;
    
        minStack.push(1);
        minStack.printStack();
        cout << "最小元素为:" << minStack.min() << endl;
    
        minStack.push(2);
        minStack.printStack();
        cout << "最小元素为:" << minStack.min() << endl;
    
        return 0;
    }
  • 相关阅读:
    (新)Linux 安装、配置 MondoDB
    Docker 简介
    Windows 环境下的mysql安装及端口更换详解
    Jenkins的使用
    .Net Core Web API 上传图片或文件
    (不适用.Net Core)layui+WebApi上传文件、上传图片
    (不适用于.Net Core环境)jquery+WebAPI 上传文件、图片
    Linux .Net Core发布项目及搭建
    Jquery+JavaScript 随笔
    Vue 随笔
  • 原文地址:https://www.cnblogs.com/tractorman/p/4052675.html
Copyright © 2020-2023  润新知