完整题目:
实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。
【要求】
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
网友评论