// 最小栈
// 思路:开两个栈,一个用来存储数据,另一个存储最小值的下标
function MinStack(): any{
let a = [], b = []
return (function(){
return {
name: 'zafu',
push: function (val: number): void {
let len = b.length
if(!len) b.push(0)
else if(a[b[len - 1]] > val) b.push(a.length)
a.push(val)
},
pop: function(): void {
if(!a.length) return ;
a.pop()
if(a.length === b[b.length - 1]) b.pop()
},
getMin: function(): number {
if(a.length) return a[b[b.length - 1]]
}
}
}())
}
// 最小队列
// shift, push
function MinQueue(): any {
let a = [], b = []
return (function(){
return {
shift: function(): void {
let len = a.length
if(!len) return
if(b[0] === a[0]) {
b.shift()
}
a.shift()
},
push: function(val: number): void {
a.push(val)
while(b.length){
if(b[b.length - 1] <= val) {
b.push(val)
return
}else b.pop()
}
if(!b.length) b.push(val)
},
getMin: function():number {
if(b.length) return b[0]
}
}
}())
}