zoukankan      html  css  js  c++  java
  • 8 包含min函数的栈

    0 引言

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

    1 抽象问题具体化

    2 具体问题抽象分析

    需要解决的两个主要问题如下。

    (1)如何在复杂度O(1)的条件下,返回当前栈的最小值。解决思路是定义一个minNum变量保存当前栈的最小值。

    (2)另外一个问题是如果当前最小值被弹出了,如何更新minNum的值。解决思路是定义一个新的栈,该栈用于保存次小的值。涉及到两步操作:

    1)什么时候入栈:当前入栈的值小于等于最小值时,入栈

    2)什么时候出栈:当前出栈值等于最小值时,更新最小值,出栈

    3 demo

    
    
        stack<int> myStack;  // 数据栈
        stack<int> minorMinNum;   // 辅助栈
        int minNum = 99999999;     // 最小值
        void push(int value) {
            if(value <= minNum){     // 只有满足当前入栈值小于等于最小值的条件,才将该值压入辅助栈中,同时更新最小值
                minorMinNum.push(value);
                minNum = value;            
            }           
            myStack.push(value);
        }
        void pop() {
            int temp;
            if(!myStack.empty()){
                temp = myStack.top();
                myStack.pop();
            }            
            if(!minorMinNum.empty()){            
                if(temp == minNum){                // 只有满足当前出栈值等于最小值的条件,更新最小值,同时辅助栈出栈
                    minorMinNum.pop();
                    minNum = minorMinNum.top();                
                }                
            }
        }
        int top() {
            return myStack.top();
        }
        int min() {
            return minNum;
        }
    
    

    4 代码优化

    可以将上述变量minNum给省掉,写法精简如下。

        stack<int> myStack;
        stack<int> minorMinNum;
        void push(int value) {
            if(minorMinNum.empty()){
                minorMinNum.push(value);
            }
            else if(value <= minorMinNum.top())
                minorMinNum.push(value);                  
            myStack.push(value);
        }
        void pop() {      
            if(!myStack.empty() && !minorMinNum.empty()){
                if(myStack.top() == minorMinNum.top())
                    minorMinNum.pop();
                myStack.pop();
            }
        }
        int top() {
            return myStack.top();
        }
        int min() {
            return minorMinNum.top();
        }
  • 相关阅读:
    A计划
    edu_6_4_1
    edu_6_2_2
    edu_6_3_1
    hdu 1205 吃糖果【鸽巢原理】
    float 为什么不能用== ,或者大于等于,或者小于等于
    素数筛法及其优化
    hdu 1106 排序
    hdu 1164 Eddy's research I
    java 格式化输出 printf 总结
  • 原文地址:https://www.cnblogs.com/ghjnwk/p/10020287.html
Copyright © 2011-2022 走看看