剑指offer - 09_用两个栈(队列)实现队列(栈) - JavaScript

题目描述:用两个栈来实现一个队列,完成队列的 Push 和 Pop 操作。 队列中的元素为 int 类型。
拓展思考:如何用两个队列实现一个栈?

解法 1: 利用栈的特性

栈的特性是:后入先出。根据题目提示,使用 2 个栈即可。一个栈inStack用来存储插入队列的数据,一个栈outStack用来从队列中取出数据。

算法分为入队和出队过程。

入队过程: 将元素放入 inStack 中。

出队过程:

  • outStack 不为空:弹出元素
  • outStack 为空:将 inStack 元素依次弹出,放入到 outStack
    中(在数据转移过程中,顺序已经从后入先出变成了先入先出)

时间复杂度是 O(N),空间复杂度是 O(N)。

var CQueue = function() {
    this.inStack = [];
    this.outStack = [];
};

CQueue.prototype.appendTail = function(value) {
    // console.log('this1:', this); // CQueue { inStack: [], outStack: [] }
    this.inStack.push(value);
}

CQueue.prototype.deleteHead = function() {
    // console.log('this2:', this); // CQueue { inStack: [], outStack: [] }
    const { inStack, outStack } = this;
    if (outStack.length) {
        return outStack.pop();
    } else {
        while (inStack.length) {
            outStack.push(inStack.pop());
        }
        return outStack.pop() || -1;
    }
};

console.log(new Boolean());

var obj = new CQueue();
console.log(obj);
obj.deleteHead();
obj.appendTail(1);
obj.appendTail(2);
obj.appendTail(3);
var param_1 = obj.deleteHead();
var param_2 = obj.deleteHead();
console.log(param_2);

拓展思考:用两个队列实现一个栈

由于队列是先入先出,无论怎么倒换,都不可能逆序队列。所以处理思路并不一样。
准备两个队列q1和q2。算法过程分为入栈和出栈。

入栈过程:

  • q1 为空,放入 q2
  • q2 为空,放入 q1
  • 均为空,默认放入 q1

出栈过程:

  • q1 为空:
    依次取出 q2 中的元素(除了最后一个),并且放入 q1 中
    取出 q2 中的最后一个元素,返回结果
  • q2 为空:
    依次取出 q1 中的元素(除了最后一个),并且放入 q2 中
    取出 q1 中的最后一个元素,返回结果
    时间复杂度是 O(N),空间复杂度是 O(N)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值