当前位置: 首页 > news >正文

算法---两个栈实现一个队列

其实JS很“流氓的”,JS的数组完全既可以是队列也可以是栈。
因为数组的push,pop就是栈的一组方法嘛。
数据的push,shift就是队列的一组方法嘛。
但是数据结构知识的需要,数据结构中对队列、栈的定义很明确:

  • 栈,先进后出

  • 队列,先进先出

现在要用两个栈实现一个队列,那么首先定义一个栈构造函数吧。

  1. 定义一个栈Stack构造函数

  2. new两个Stack,stack1,stack2

  3. stack1实现队列的进就好了

  4. stack2实现队列的出就好了
    重点来了,进的时候去的是stack1,怎么从stack2出数据呢

  5. 当栈2为空,栈1不为空时,把栈1的数据依次pop出去到栈2中,这样再栈2pop时就是队列应该pop的数据了


上代码:

function Queue(){
    var items = [];
    function Stack() {
        var item = [];
        this.push = function (elem) {
            item.push(elem);
            return item;
        };
        this.pop = function () {
            return item.pop();
        };
        this.isEmpty = function () {
            return item.length === 0;
        };
        this.get = function () {
            return item;
        };
    }
    var stack1 = new Stack();
    var stack2 = new Stack();
    this.push = function (elem) {
        stack1.push(elem);
        return items.push(elem);
    }
    this.pop = function () {
        if(stack1.isEmpty() && stack2.isEmpty()){
            throw new Error("空队列");
        }
        if(stack2.isEmpty() && !stack1.isEmpty()){
            while(!stack1.isEmpty()){
                stack2.push(stack1.pop());
            }
            return stack2.pop();
        }
    };
    this.get = function () {
        if(!stack2.isEmpty()){
            return stack2.get().reverse();
        }else{
            return items;
        }
    }
}
var queue = new Queue();
queue.push(0);
queue.push(1);
queue.push(2);
queue.get();
queue.pop();
queue.get();

相关文章:

  • 机场打车有感
  • redis学习笔记(三):列表、集合、有序集合
  • AI创投的冰与火之歌:泡沫、跟风、短板和有钱花不出去的沮丧【转】
  • iOS 开发之 -- UDID和UUID的详解
  • WDS 三种模式
  • C++11: atomic 头文件
  • 有特殊字符的JSON串
  • 微信错误提示code= -4/微信发送被拒绝
  • 关于mysql的初步学习 (四)
  • Nested loops、Hash join、Sort merge join(三种连接类型原理、使用要点)
  • GridView中字符串太长处理方式
  • Squid.conf配置文件详解
  • CCF NOI1034 钞票兑换
  • Oracle11_g R2安装配置及PL/SQL Developer安装配置
  • ASP.NET 无权访问所请求的资源。请考虑对 ASP.NET 请求标识授予访问此资源的权限。...
  • 分享一款快速APP功能测试工具
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • Computed property XXX was assigned to but it has no setter
  • eclipse(luna)创建web工程
  • egg(89)--egg之redis的发布和订阅
  • ES2017异步函数现已正式可用
  • iOS | NSProxy
  • javascript 哈希表
  • Js基础——数据类型之Null和Undefined
  • mysql innodb 索引使用指南
  • RxJS: 简单入门
  • Shell编程
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • TCP拥塞控制
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • 分布式事物理论与实践
  • 高性能JavaScript阅读简记(三)
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 机器学习中为什么要做归一化normalization
  • 区块链分支循环
  • 使用parted解决大于2T的磁盘分区
  • 移动端 h5开发相关内容总结(三)
  • 阿里云ACE认证之理解CDN技术
  • ​第20课 在Android Native开发中加入新的C++类
  • #pragma pack(1)
  • (39)STM32——FLASH闪存
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (二十三)Flask之高频面试点
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (十一)c52学习之旅-动态数码管
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .net 调用php,php 调用.net com组件 --
  • .NET开源项目介绍及资源推荐:数据持久层
  • .net实现客户区延伸至至非客户区
  • .net实现头像缩放截取功能 -----转载自accp教程网