LeetCode上用栈实现队列,简单难度,涉及数据结构,记录下解题思路
因为这里要用栈实现队列的功能
在数据结构中栈是先进后出而队列是先进先出
所以要用栈来实现队列的功能,最需要解决的就是数据进出顺序的问题
假设现在有一个栈[1,2,3,4]
在栈的模式下只能从后往前取元素,例如想取出2
这个元素,就需要经过[1,2,3] > [1,2] > [1]
这个过程,每次都是取栈的最后一位。
同理添加元素也只能添加到最后一位
但是在队列模式下,取元素是从队列首位取出,添加元素是添加到末尾
那么要用栈实现队列的功能,就要设置两个栈作为进队和出队的操作,现在设置input入队栈
和output出队栈
向下箭头表示数据放入的顺序,因为栈是先进后出,这里要模拟的是先进先出的效果
相当于把
input入队栈
重新翻转了一次将之前最后放入的元素放在栈的前面,最先放入的元素放到了栈尾。比如1,是第一个传入的元素,之后再
pop
取元素的话就是能够第一个就拿到了,实现了先进先出的效果
var MyQueue = function() {
// 创建两个栈
this.input = []
this.output = []
};
// 添加元素,是添加到队尾
MyQueue.prototype.push = function(x) {
this.input.push(x)
};
// 取出元素是取队头
MyQueue.prototype.pop = function() {
// 如果出队栈为空,进行翻转操作
if(this.output.length === 0) {
// 取入队栈里面所有元素
while(this.input.length) {
// 从后往前取放入出队栈
this.output.push(this.input.pop())
}
}
// 返回出队栈的最后一个元素,即入队栈的第一个元素
return this.output.pop()
};
MyQueue.prototype.peek = function() {
// 同样操作
if(this.output.length === 0) {
while(this.input.length) {
this.output.push(this.input.pop())
}
}
// 因为翻转过,所以出队栈最后一位就是入队栈的第一位,也就是队列头
return this.output[this.output.length - 1]
};
MyQueue.prototype.empty = function() {
if(this.input.length || this.output.length){
return false
} else{
return true
}
};