代码随想录 day10

栈与队列的背景知识:

一句话,栈先进后出,队列先进先出。根据这俩特性来对栈和数组进行操作。

题一:利用栈实现队列

题目链接:栈实现队列
解题思路: 要用栈实现队列,即利用先进后出实现先进先出,不妨用俩个栈,一个用作入栈,一个用作出栈。出栈的时候需要判断出栈列表是否为空,如果为空,则需要从入栈列表中引入,如果不为空直接出就行,我在这里就犯了一个错误,不管为不为空都把入栈表清理一遍,后面执行的时候发现报错,仔细想了一下发现不能这样写,因为这样肯定会出现顺序混乱的现象,举个例子,先进入队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;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值