剑指offer – 用两个栈(队列)实现队列(栈) – JavaScript

作者 : 开心源码 本文共941个字,预计阅读时间需要3分钟 发布时间: 2022-05-13 共225人阅读

专注前台与算法的系列干货分享,欢迎关注(???):
「微信公众号:心谭博客」| xxoo521.com | GitHub

题目形容

用两个栈来实现一个队列,完成队列的 Push 和 Pop 操作。 队列中的元素为 int 类型。

解法 1: 利用栈的特性

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

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

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

出队过程

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

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

// 原文地址:https://xxoo521.com/2019-12-23-zhan-shi-xian-dui-lie/// ac地址:https://www.nowcoder.com/practice/54275ddae22f475981afa2244dd448c6const inStack = [];const outStack = [];function push(node) {    inStack.push(node);}function pop() {    if (outStack.length) {        return outStack.pop();    } else {        while (inStack.length) {            outStack.push(inStack.pop());        }        return outStack.pop();    }}

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

相似地,用两个队列也可以实现一个栈。但因为队列是先入先出,无论怎样倒换,都不可能逆序队列。所以解决思路并不一样。

准备两个队列q1q2。算法过程分为入栈和出栈。

入栈过程

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

出栈过程

  • q1 为空:
    • 依次取出 q2 中的元素(除了最后一个),并且放入 q1 中
    • 取出 q2 中的最后一个元素,返回结果
  • q2 为空:
    • 依次取出 q1 中的元素(除了最后一个),并且放入 q2 中
    • 取出 q1 中的最后一个元素,返回结果

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


专注前台与算法的系列干货分享,欢迎关注(???)

image

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 剑指offer – 用两个栈(队列)实现队列(栈) – JavaScript

发表回复