栈与队列的背景知识:
一句话,栈先进后出,队列先进先出。根据这俩特性来对栈和数组进行操作。
题一:利用栈实现队列
题目链接:栈实现队列
解题思路: 要用栈实现队列,即利用先进后出实现先进先出,不妨用俩个栈,一个用作入栈,一个用作出栈。出栈的时候需要判断出栈列表是否为空,如果为空,则需要从入栈列表中引入,如果不为空直接出就行,我在这里就犯了一个错误,不管为不为空都把入栈表清理一遍,后面执行的时候发现报错,仔细想了一下发现不能这样写,因为这样肯定会出现顺序混乱的现象,举个例子,先进入队1、2、3、4.然后再执行一个出队操作,照之前我那错误的写法应依次加入4、3、2、1到出栈当中,然后弹出1,我们再入一个5,再执行出队操作,此时如果按我这种逻辑的话,5就在出栈栈顶也就是队头了,这样肯定不行。
代码如下:
var MyStack = function () {
this.queue = [];
};
/**
* @param {number} x
* @return {void}
*/
MyStack.prototype.push = function (x) {
this.queue.push(x);
};
/**
* @return {number}
*/
MyStack.prototype.pop = function () {
let len = this.queue.length - 1;
while (len--) {
this.queue.push(this.queue.shift());
}
return this.queue.shift();
};
/**
* @return {number}
*/
MyStack.prototype.top = function () {
let len = this.queue.length - 1;
while (len--) {
this.queue.push(this.queue.shift());
}
let ans = this.queue.shift();
this.queue.push(ans);
return ans;
};
/**
* @return {boolean}
*/
MyStack.prototype.empty = function () {
if (this.queue.length) return false;
return true;
};
题二:利用队列实现栈
题目链接: 队列实现栈
解题思路: 使用先进先出的特性实现先进后出的特性,这里可以用两个队列实现,也可以用一个队列实现,其实大致的操作差不多,使用俩个队列的话,设这两个队列分别为que1,que2,que2就只在que1出队的时候把除了最后的元素都入队;用一个队列的话就是把que1.length - 1 长度的元素依次出队再入队列,这样一趟操作下来原来在队尾的元素就在队头了,直接出队即可,我们就可以实现1
解题代码:
var MyStack = function () {
this.queue = [];
};
/**
* @param {number} x
* @return {void}
*/
MyStack.prototype.push = function (x) {
this.queue.push(x);
};
/**
* @return {number}
*/
MyStack.prototype.pop = function () {
let len = this.queue.length - 1;
while (len--) {
this.queue.push(this.queue.shift());
}
return this.queue.shift();
};
/**
* @return {number}
*/
MyStack.prototype.top = function () {
let len = this.queue.length - 1;
while (len--) {
this.queue.push(this.queue.shift());
}
let ans = this.queue.shift();
this.queue.push(ans);
return ans;
};
/**
* @return {boolean}
*/
MyStack.prototype.empty = function () {
if (this.queue.length) return false;
return true;
};