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 () { ]; }; // 栈是否为空 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用数组实现栈和队列的更多相关文章
- JavaScript 数据结构与算法之美 - 线性表(数组、栈、队列、链表)
前言 基础知识就像是一座大楼的地基,它决定了我们的技术高度. 我们应该多掌握一些可移值的技术或者再过十几年应该都不会过时的技术,数据结构与算法就是其中之一. 栈.队列.链表.堆 是数据结构与算法中的基 ...
- JavaScript数组模拟栈和队列
*栈和队列:js中没有真正的栈和队列的类型 一切都是用数组对象模拟的 栈:只能从一端进出的数组,另一端封闭 FILO 何时使用:今后只要仅希望数组只能从一端进 ...
- 算法入门 - 基于动态数组的栈和队列(Java版本)
之前我们学习了动态数组的实现,接下来我们用它来实现两种数据结构--栈和队列.首先,我们先来看一下栈. 什么是栈? 栈是计算机的一种数据结构,它可以临时存储数据.那么它跟数组有何区别呢? 我们知道,在数 ...
- 关于JS数组的栈和队列操作
1.js支持重载吗? 虽然js 本身并没有函数重载,但是可以用arguments来模拟重载,函数名相同,参数不同,arguments的length属性,获取参数个数,索引属性获取参数值 2.什么是作用 ...
- Java的数组,栈,队列
import java.util.Arrays; public class Array<E> { private E[] data; private int size; //构造函数,传入 ...
- 栈与队列(Stack and Queue)
1.定义 栈:后进先出(LIFO-last in first out):最后插入的元素最先出来. 队列:先进先出(FIFO-first in first out):最先插入的元素最先出来. 2.用数组 ...
- JavaScript高级程序设计--对象,数组(栈方法,队列方法,重排序方法,迭代方法)
1.使用对象字面量定义对象 var person={}; 使用这种方式创建对象时,实际上不会调用Object构造函数. 开发人员更喜欢对象字面量的语法. 2.有时候需要传递大量可选参数的情形时,一 ...
- 学习javascript数据结构(一)——栈和队列
前言 只要你不计较得失,人生还有什么不能想法子克服的. 原文地址:学习javascript数据结构(一)--栈和队列 博主博客地址:Damonare的个人博客 几乎所有的编程语言都原生支持数组类型,因 ...
- JavaScript中的算法之美——栈、队列、表
序 最近花了比较多的时间来学习前端的知识,在这个期间也看到了很多的优秀的文章,其中Aaron可能在这个算法方面算是我的启蒙,在此衷心感谢Aaron的付出和奉献,同时自己也会坚定的走前人这种无私奉献的分 ...
随机推荐
- angular JS中使用jquery datatable添加checkbox点击事件
'use strict'; app.controller('DataTableCtrl', function ($scope, $compile) { $scope.selected = []; $s ...
- zookeeper+dubbo简单使用
首先下载zookeeper,直接百度官网下载即可! 下载完之后,把cfg配置文件改名为zoo.cfg,如下: 在bin目录下启动zkServer即可! 项目结构: 简单讲解:首先dubbo是一个mav ...
- 【Lab】Python改bat文件
[Lab]Python改bat文件 给出一个特定的树形结构,每一层的数字依次递增后,按照从上到下,同时从左到右这样的顺序生成.这么说还是不太明白,比如下面这个简单的树形结构. 按照顺序应该写成这样[3 ...
- 安徽省2016“京胜杯”程序设计大赛_J_YZK的大别墅
YZK的大别墅 Time Limit: 1000 MS Memory Limit: 65536 KB Total Submissions: 24 Accepted: 12 Description 土豪 ...
- properties文件作用以及在哪些地方用
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import ...
- Loadrunner常见错误处理方法
1.错误 -26601: 解压缩函数(wgzMemDecompressBuffer)失败,返回代码=-5 (Z_BUF_ERROR).inSize=0.inUse=0.outUse=0 用LR做压力测 ...
- 浅谈JS中的高级函数
在JavaScript中,函数的功能十分强大.它们是第一类对象,也可以作为另一个对象的方法,还可以作为参数传入另一个函数,不仅如此,还能被一个函数返回!可以说,在JS中,函数无处不在,无所不能,堪比孙 ...
- Andrew Ng机器学习课程笔记(五)之应用机器学习的建议
Andrew Ng机器学习课程笔记(五)之 应用机器学习的建议 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7368472.h ...
- C#使用Xamarin开发可移植移动应用(3.Xamarin.Views控件)附源码
前言 系列目录 C#使用Xamarin开发可移植移动应用目录 源码地址:https://github.com/l2999019/DemoApp 可以Star一下,随意 - - 说点什么.. .NET ...
- 【leetocde】 105. Construct Binary Tree from Preorder and Inorder Traversal
Given preorder and inorder traversal of a tree, construct the binary tree. Note:You may assume that ...