zoukankan      html  css  js  c++  java
  • NO.2 设计包含min 函数的栈

    题目:

      定义栈的数据结构,要求添加一个min 函数,能够得到栈的最小元素。
      要求函数min、push 以及pop 的时间复杂度都是O(1)。

    思路:

      此题初看也是毫无思路的,栈这个结构我们很熟悉,min的时间复杂度为O(1)最先联想的是最小优先级队列,肯定是不可以的。思考发现,栈的特性可以找到的两个O(1)操作只有push和pop,MIN值的结构也是栈的FILO。FIFO与FILO真是世界上所有次序关系的高度概括。因此考虑辅助堆栈。

    代码:

    //首先建立几个链栈,注意指针的指向与栈的生长方向
    class
    Stack { public: Stack(): base(NULL), top(NULL) {} void Push(int elem) { StackNode *temp = new StackNode(elem); if (base == NULL) { base = temp; top = base; } else { temp->pre = top; top = temp; } } int Pop() { if (base != top) { int temp = top->_elem; StackNode *p = top; top = top->pre; delete p; return temp; } else { int temp = top->_elem; delete top; top = NULL; base = NULL; } return NULL; } int Get() { if (top != NULL) { return top->_elem; } return NULL; } bool Empty() { if (top != NULL) { return false; } return true; } private: StackNode *base; StackNode *top; };
    class MinStack : public Stack
    {
    public:
        int Min()
        {
            return stack.Get();
        }
        
        void Push(int elem)
        {
            Stack::Push(elem);//调用基类PUSH
            if (stack.Empty() || elem <= stack.Get())
            {
                stack.Push(elem);
            }
        }
    
        int Pop()
        {
            int elem = Stack::Pop();//调用基类POP
            if (elem == stack.Get())
            {
                stack.Pop();
            }
            return elem;
        }
    
    private:
        Stack stack; //辅助栈,保持MIN
    };

    总结:

    堆栈结构本身是简单的,但是又有回溯法、递归调用的复杂应用,基本的Coding是远远不够的

  • 相关阅读:
    类型转换
    关于lseek()
    ubuntuj开机没有开机音乐
    Linux下PF_PACKET的使用
    运行apue下的第一个程序
    Spring Framework 开发参考手册
    mysql blob
    此驱动程序不支持 Java Runtime Environment (JRE) 1.6 版。请使用支持 JDBC 4.0 的 sqljdbc4.jar 类库
    [转]解决:The Apache Tomcat Native library which allows optimal performance in production environments was not found
    java等号
  • 原文地址:https://www.cnblogs.com/zjgtan/p/2913433.html
Copyright © 2011-2022 走看看