美文网首页
js实现一个栈,要求pop push getMin的时间复杂度都

js实现一个栈,要求pop push getMin的时间复杂度都

作者: 指尖跳动 | 来源:发表于2019-06-08 08:11 被阅读0次

    完整题目:

    实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。

    【要求】

    pop(弹栈)、push(入栈)、getMin操作的时间复杂度都是O(1)

    实现思路

    1.js没有原生的栈类型,首先准备两个数组来模拟栈,一个是data数组,一个是min数组

    2.第一数入栈的时候,data数组和min数组都插入这个数,后面再有数入栈的时候,data数组正常入栈,入min数组的时候,拿当前数与min数组最后一个数比较,较小的数入min数组

    3.弹栈的时候,data数组和min数组同时弹出数组最后一个数据

    4.通过getMin获取最小值的时候,直接返回min数组的最后一个数即可(但是不弹出)

    图解流程

    首先准备两个空栈,data栈和min栈,入第一个数的时候,两个数同时入栈,如下图:



    入第二个数6的时候,data栈正常入栈,但是,6入min栈之前,先与min栈的栈顶数进行比较,哪个数小就入到min栈,比较后发现,min栈原来的数5小,那么直接入5



    入第三个数3的时候,data栈正常入栈,3与min栈栈顶的5进行比较,3较小,则min栈入3

    通过上面的步骤可以看出,每个阶段,min栈的栈顶数都是当前data栈的最小值,这样就可以保证getMin的时间复杂也为O(1)

    注意:弹出数据的时候,data栈和min栈同时弹出即可

    代码实现

          class Stack{
           constructor(){
               this.dataStack = []
               this.miniStack = []
           }
    
           push(num){
              if(this.dataStack.length===0){
                  this.dataStack.push(num)
                  this.miniStack.push(num)
              } else{
                  this.dataStack.push(num)
                  if(num<this.miniStack[this.miniStack.length-1]){
                      this.miniStack.push(num)
                  }else{
                      this.miniStack.push(this.miniStack[this.miniStack.length-1])
                  }
    
              }
           }
    
           pop(){
               if(this.dataStack.length===0){
                  throw new  Error('栈没有数据了')
               }
               this.miniStack.pop()
               return this.dataStack.pop()
           }
    
           getMin(){
               if(this.dataStack.length===0){
                   throw new  Error('栈没有数据了')
               }
               return this.miniStack[this.miniStack.length-1]
           }
       }
    
       var stack = new Stack()
       stack.push(5)
       stack.push(4)
       stack.push(3)
       stack.push(6)
       stack.push(2)
       stack.push(8)
    
       console.log(stack.getMin()) //2
       stack.pop()
       console.log(stack.getMin()) //2
       stack.pop()
       console.log(stack.getMin()) //3
    
    

    相关文章

      网友评论

          本文标题:js实现一个栈,要求pop push getMin的时间复杂度都

          本文链接:https://www.haomeiwen.com/subject/vtibxctx.html