Javascript用数组实现栈和队列

栈是遵循后进先出(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 () {
                return items[items.length - 1];
            };
            // 栈是否为空
            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由小到大)排列

欢迎补充或指正

时间: 2024-11-05 09:20:39

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

JavaScript数组模拟栈和队列

*栈和队列:js中没有真正的栈和队列的类型              一切都是用数组对象模拟的 栈:只能从一端进出的数组,另一端封闭       FILO   何时使用:今后只要仅希望数组只能从一端进出时   如何使用:2种情况:     1. 末尾出入栈:已入栈元素的下标不再改变        入栈: arr.push(新值1,...)        出站: var last=arr.pop() 2. 开头出入栈:每次入栈新元素时,已入栈元素的位置都会向后顺移.        入栈:arr.u

用数组实现栈和队列

本篇文章是模拟LinkedList实现其中的:添加,取值,入队,出队,入栈,出栈 1.动态数组的实现 package com.sxt.test.java; public class Array { protected Object[] arrays = new Object[0]; protected Object[] arrays2=null; //每增加一个元素,就新建一个比原来长度+1的数组, //把原来数组的数据都放入新的数组,最后把新加的数据添到最后 //原数组置空 public vo

数组实现栈和队列

数组栈: public class ArrayStack { private Integer[] arr; private Integer index; public ArrayStack(int initSize) { if(initSize < 0) { throw new IllegalArgumentException("this init size is less than 0"); } arr = new Integer[initSize]; index = 0; }

【自考】数据结构第三章,栈、队列、数组,期末不挂科指南,第3篇

学习目标 自考重点.期末考试必过指南,这篇文章让你理解什么是栈.什么是队列.什么是数组 掌握栈.队列的顺序存储结构和链式存储结构 掌握栈.队列的基本操作在顺序存储结构和链式存储结构上的实现 掌握矩阵的压缩存储 今天核心咱们先把栈搞清楚 栈和队列可以看做是特殊的线性表 .它们的特殊性表现在它们的基本运算是线性表运算的子集,它们是运算受限的线性表 栈 栈(Stack)是运算受限的线性表,这种线性表上的插入和删除操作限定在表的一端进行 基本概念 栈顶:允许插入和删除的一端 栈尾:另一端 空栈:不含任何

实现特殊的栈和队列

利用一个固定数组实现栈和队列 class ArrayStack //用数组实现栈 { public: ArrayStack(int initsize) //创建一个固定长度的数组 { if (initsize < 0) { cout << "数组长度小于0" << endl; } else { array = vector<int>(initsize - 1); size = 0; } } void push(int obj) { if (si

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

1.使用对象字面量定义对象 var person={}; 使用这种方式创建对象时,实际上不会调用Object构造函数. 开发人员更喜欢对象字面量的语法. 2.有时候需要传递大量可选参数的情形时,一般来讲使用对象字面量来封装多个可选参数. 3.对象属性的点表示法与方括号表示法的区别 (1)功能上:两者没区别 (2)但是方括号的有点是可以通过变量来访问属性 例如: var person={ name:"Nic" } 点表示法:person.name 方括号表示法:var prop=“nam

javascript中的栈、队列。

                       javascript中的栈.队列 栈方法     栈是一种LIFO(后进先出)的数据结构,在js中实现只需用到2个函数 push()  接受参数并将其放置数组尾,并返回修改后的数组长度. pop()  移除数组尾的最后一项,并返回移除项的值. 事例: var colors = new Array();var count = colors.push("red","green"); count = colors.push(&

JavaScript的数组实现队列与堆栈的方法

JavaScript的数组实现队列与堆栈的方法 今天在项目中要使用JavaScript实现数据结构中的队列和堆栈,这里做一下总结. 一.队列和堆栈的简单介绍 1.1.队列的基本概念 队列:是一种支持先进先出(FIFO)的集合,即先被插入的数据,先被取出! 如下图所示: 1.2.堆栈的基本概念 堆栈:是一种支持后进先出(LIFO)的集合,即后被插入的数据,先被取出! 如下图所示: 二. 在JavaScript中实现队列和堆栈 在JavaScript中实现队列和数组主要是通过数组,js数组中提供了以

快速记忆数组栈和队列函数push()和shift()

在js中,对数组的操作是比较常见的,有时候,我们需要模拟栈和队列的特性才能实现需求,今天来给大家用通俗易懂.简洁明了的几行文字,来告诉大家栈和队列的几个函数,如何快速记住. 首先,概念还是要知道的: 栈(stack)又名堆栈,它是一种运算受限的线性表.其限制是仅允许在表的一端进行插入和删除运算.这一端被称为栈顶,相对地,把另一端称为栈底.向一个栈插入新元素又称作进栈.入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素:从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻