栈是遵循后进先出(LIFO)规则的一种有序集合,比如桌上的一叠书,我们只能从上面放或取。

队列是遵循先进先出(FIFO)规则的一种有序集合,比如排队,先排到的先离开。

数组也是一种有序的集合,它与上面两种数据结构类似。由于JavaScript中的数组本身拥有许多简单的方法,如push(), 所以用数组来表示栈和队列非常简单。

首先回顾一下相关的方法:

push():向数组尾部添加一个或多个项。

pop():删除数组尾部的一个项。

unshift():先数组头部添加一个或多个项。

shift():删除数组头部的一个项。

用数组表示栈。数组的尾部,也就是栈的尾部,称作栈顶,另一端是栈底。越是后面添加的元素越靠近栈顶,所以对栈的操作都集中在栈顶。

// 栈的构造函数function Stack() {
// 初始化一个数组
            var items = [];
            // 入栈
            this.push = function (elem) {
                items.push(elem);
            };
            // 出栈,并返回该元素
            this.pop = function () {
                return items.pop();
            };
            // 返回栈顶元素
            this.peek = function () {
                ];
            };
            // 栈是否为空
            this.isEmpty = function () {
                return !items.length;
            };
            // 返回栈的大小(长度)
            this.size = function () {
                return items.length;
            };
            // 清空栈
            this.clear = function () {
                items = [];
            };
            // 打印栈
            this.print = function () {
                console.log(items.toString());
            };
        }

以上是一个栈的构造函数,接下来我们实例化一个栈。

var stack = new Stack();
stack.push("Jack");
stack.push("Mike");
stack.push("Candy");
stack.print(); // Jack,Mike,Candy
stack.pop();
stack.print(); // Jack,Mike

stack是一个栈的实例,Jack,Mike,Candy按顺序入栈,然后删除一个栈顶元素(Candy),得到Jack,Mike。

栈除了能模拟生活中的例子以外,还能解决一些计算机科学中的问题。这里举一个例子——十进制转换成二进制。

二进制是逢二进一,所以我们只要将十进制的数不停地除以二,直到被除数等于0,将得到的每一个余数(0或1)按顺序排列而成的便是对应的二进制数。

下面用代码实现:

function Stack() {
            // 同上
    };

function divideBy2(num) {
            var stack = new Stack(), // 实例化一个栈
                result = "", // 用来存放最终的二进制数
                rem; // 用来存放余数

            while (num > 0) {
                rem = Math.floor(num % 2);
                stack.push(rem);
                num = Math.floor(num / 2);
            }

            // 取栈顶元素,存放在result中,也就是一个反向排序的过程
            while (!stack.isEmpty()) {
                result += stack.pop().toString();
            }

            return result;
        }

用数组表示队列。队列是从底部添加元素,从尾部删除元素。

// 队列
function Queue() {
    // 初始化数组
    var items = [];
    // 入队列
    this.enqueue = function (elem) {
        items.push(elem);
    };
    // 出队列,并返回该元素
    this.dequeue = function () {
        return items.shift();
    };
    // 返回队列顶部元素
    this.front = function () {
        return items[0];
    };
    // 判断是否为空
    this.isEmpty = function () {
        return !items.length;
    };
    // 返回队列长度
    this.size = function () {
        return items.length;
    };
    // 打印队列
    this.print = function () {
        console.log(items.toString());
    }
}

实例化:

var queue = new Queue();
queue.enqueue("Jack");
queue.enqueue("Mike");
queue.enqueue("Candy");
queue.print(); // Jack,Mike,Candy
queue.dequeue();
queue.print(); // Mike,Candy

优级先队列。优先级队列是队列的升级版,队列中的每个元素都带有优先级,优先级高的排在队列靠顶部位置,优先级低的排在队列靠尾部位置。这就好像网上买票需要排队,而会员具有比较高的优先级,会被排在普通用户的前面。

下面是代码实现:

// 优先队列
function PriorityQueue() {
    // 初始化数组
    var items = [];

    // 优先级元素的构造函数
    function priorityElem(elem, priority) {
          this.elem = elem;
          this.priority = priority;
    };

    // 入队列
    this.enqueue = function (elem, priority) {
          elem = new priorityElem(elem, priority); // 优先级元素
          if (this.isEmpty()) { // 如果队列是空的,直接入队列
              items.push(elem);
          } else {
              var added = false;
              for (var i = 0; i < items.length; i++) {
                  // 插入到优先级低的(priority大的)元素之前
                  if (elem.priority < items[0].priority) {
                      items.splice(i, 0, elem);
                      added = true;
                      break;
                  }
              }
              // 没有比该元素优先级低的,则将该元素添加到尾部
              if (!added) {
                  items.push(elem);
              }
           }
        };

       this.print = function () {
          console.log(items[3]);
       }
};

实例化:

var queue = new PriorityQueue();
queue.enqueue("Jack", 2);
queue.enqueue("Mike", 3);
queue.enqueue("Candy", 1);
queue.print(); // Candy,Jack,Mike

队列按优先级由高到低(priority由小到大)排列

欢迎补充或指正

Javascript用数组实现栈和队列的更多相关文章

  1. JavaScript 数据结构与算法之美 - 线性表(数组、栈、队列、链表)

    前言 基础知识就像是一座大楼的地基,它决定了我们的技术高度. 我们应该多掌握一些可移值的技术或者再过十几年应该都不会过时的技术,数据结构与算法就是其中之一. 栈.队列.链表.堆 是数据结构与算法中的基 ...

  2. JavaScript数组模拟栈和队列

    *栈和队列:js中没有真正的栈和队列的类型              一切都是用数组对象模拟的 栈:只能从一端进出的数组,另一端封闭       FILO   何时使用:今后只要仅希望数组只能从一端进 ...

  3. 算法入门 - 基于动态数组的栈和队列(Java版本)

    之前我们学习了动态数组的实现,接下来我们用它来实现两种数据结构--栈和队列.首先,我们先来看一下栈. 什么是栈? 栈是计算机的一种数据结构,它可以临时存储数据.那么它跟数组有何区别呢? 我们知道,在数 ...

  4. 关于JS数组的栈和队列操作

    1.js支持重载吗? 虽然js 本身并没有函数重载,但是可以用arguments来模拟重载,函数名相同,参数不同,arguments的length属性,获取参数个数,索引属性获取参数值 2.什么是作用 ...

  5. Java的数组,栈,队列

    import java.util.Arrays; public class Array<E> { private E[] data; private int size; //构造函数,传入 ...

  6. 栈与队列(Stack and Queue)

    1.定义 栈:后进先出(LIFO-last in first out):最后插入的元素最先出来. 队列:先进先出(FIFO-first in first out):最先插入的元素最先出来. 2.用数组 ...

  7. JavaScript高级程序设计--对象,数组(栈方法,队列方法,重排序方法,迭代方法)

    1.使用对象字面量定义对象 var person={}; 使用这种方式创建对象时,实际上不会调用Object构造函数. 开发人员更喜欢对象字面量的语法.   2.有时候需要传递大量可选参数的情形时,一 ...

  8. 学习javascript数据结构(一)——栈和队列

    前言 只要你不计较得失,人生还有什么不能想法子克服的. 原文地址:学习javascript数据结构(一)--栈和队列 博主博客地址:Damonare的个人博客 几乎所有的编程语言都原生支持数组类型,因 ...

  9. JavaScript中的算法之美——栈、队列、表

    序 最近花了比较多的时间来学习前端的知识,在这个期间也看到了很多的优秀的文章,其中Aaron可能在这个算法方面算是我的启蒙,在此衷心感谢Aaron的付出和奉献,同时自己也会坚定的走前人这种无私奉献的分 ...

随机推荐

  1. JARVIS 手机监控局域网内PC

    JARVIS 通过反向的Socket连接,实现通过手机(或任何可以发送Http请求的设备)对局域网内PC的监控.在外时可以远程监视家里PC任务的执行情况,甚至远程唤醒家里的PC提前打开游戏也可以实现( ...

  2. JStorm与Storm源码分析(五)--SpoutOutputCollector与代理模式

    本文主要是解析SpoutOutputCollector源码,顺便分析该类中所涉及的设计模式–代理模式. 首先介绍一下Spout输出收集器接口–ISpoutOutputCollector,该接口主要声明 ...

  3. canvas学习总结六:绘制矩形

    在第三章中(canvas学习总结三:绘制路径-线段)我们提高Canvas绘图环境中有些属于立即绘制图形方法,有些绘图方法是基于路径的. 立即绘制图形方法仅有两个strokeRect(),fillRec ...

  4. Spring核心--IOC

    先说说Spring框架 Spring框架 Spring框架的作用 Spring 的核心(IOC功能) SpringAOP功能 原有的业务流程:请求->servlet-->service-- ...

  5. PHP输出函数print, printf, sprintf的区别

    PHP中常用的字符串输出方式是:使用echo和print两种方法来显示字符串.如果涉及格式化输出操作,还可以试用printf和sprintf函数. 一.先说echo和print两种方法 print的语 ...

  6. Java面试容易容易出现的一些考点

    考点内容是我个人的一点看法,不代表一定是这些,后面会慢慢继续补充 请写出final.finally.finalize的区别 1.final和finally都是关键字.而finalize是一个方法,是属 ...

  7. ABP+AdminLTE+Bootstrap Table权限管理系统第三节--abp分层体系及实体相关

    说了这么久,还没有详细说到abp框架,abp其实基于DDD(领域驱动设计)原则的细看分层如下: 再看我们项目解决方案如下: JCmsErp.Application,应用层:进行展现层与领域层之间的协调 ...

  8. ### 七种SQL JOINS

    七种SQL JOINS 1.SELECT FROM TABLEA A LEFT JOIN TABLEB B ON A.Key=B.Key 2.SELECT FROM TABLEA A RIGHT JO ...

  9. 分享一道JS前端闭包面试题

    输出以下代码的结果 function fun(n,o){ console.log(o); return { fun:function(m){ return fun(m,n);//[1] } } } v ...

  10. Qt5.8以上版本编译Oracle数据库的OCI驱动教程

    在前一篇的文章中我已经发过一个相似的文章,详情请点击:Qt5编译oracle驱动教程. 在那一篇文章中已经可以解决了Qt5的常用版本的Oracle数据库驱动的支持,但是在新的Qt开发工具中那种方法竟然 ...