zoukankan      html  css  js  c++  java
  • 包含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;
    }
  • 相关阅读:
    python note 30 断点续传
    python note 29 线程创建
    python note 28 socketserver
    python note 27 粘包
    python note 26 socket
    python note 25 约束
    Sed 用法
    python note 24 反射
    python note 23 组合
    python note 22 面向对象成员
  • 原文地址:https://www.cnblogs.com/tractorman/p/4052675.html
Copyright © 2011-2022 走看看