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

2019-06-08  本文已影响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

上一篇下一篇

猜你喜欢

热点阅读