JavaScript数据结构与算法—— 栈

news/2024/4/19 0:10:19

我们可以在数组的任何位置上删除或者添加元素,但有时候我们还需要在元素的添加或删除时有更多控制的数据结构,有两种数据结构类似于数组,但在添加或删除元素时更为可控,它们就是栈和队列。
本节主要介绍栈。

1.栈数据结构

栈是一种遵循后进先出(LIFO)原则的有序集合。新添加的或待删除的元素都保存在栈的同一端,叫做栈顶,另一端叫栈底。在栈中,新元素靠近栈顶,旧元素接近栈底。如下图所示:
clipboard.png

2.创建栈

// 首先创建一类表示栈
function Stack(){let items = []; // 选择数组来保存栈中的元素 //各种属性和方法
}

下面要为栈声明一些方法:

push()  //  添加一个或多个新元素到栈顶
pop()  //  移除栈顶元素,同时返回被移除的元素
peek()  // 仅仅返回栈顶元素,不对栈做任何修改
isEmpty()  //  如果栈中没有元素返回true,否则返回false
clear()  // 移除栈中所有元素
size()  // 返回栈中元素的个数(和数组length类似) 

2.1 向栈添加元素

this.push() = function(element) {items.push(element);
}

2.2 从栈移除元素

this.pop = function() {items.pop();
}

2.3 查看栈顶元素

this.peek = function() {return items[items.length - 1];
}

2.4 查看栈是否为空

this.isEmpty = function(){return items.length === 0;
}
this.size = function() {return items.lenght;
}

2.5 清空和打印栈元素

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

经过上述的方法的添加,我们就完整的创建了一了个栈 Stack。

3.栈的应用—十进制转N进制

首先我们写出将十进制转为二进制:

function divideBy2(decNum) {var remStack = new Stack(),rem,binaryString = '';// 将十进制数除2的余数放入一个stack中    while(decNum > 0) {// 取余rem = Math.floor(decNum % 2);// 入栈remStack.push(rem);decNum = Math.floor(decNum / 2);}    // 从栈中取出转化为字符串然后连接起来构成二进制while(!remStack.isEmpty()) {// 出栈binaryString += remStack.pop().toString();} return binaryString;
}

下面十进制转化N进制算法

function divideByN(decNum, n) {var remStack = new Stack(),rem,binaryString = '',digits = '0123456789ABCDEF';// 将十进制数除N的余数放入一个stack中    while(decNum > 0) {// 取余rem = Math.floor(decNum % n);// 入栈remStack.push(rem);decNum = Math.floor(decNum / n);}    // 从栈中取出转化为字符串然后连接起来构成二进制while(!remStack.isEmpty()) {// 出栈 使用digits方便在16进制中做个对应转化binaryString += digits[remStack.pop()];} return binaryString;
}

https://dhexx.cn/news/show-696588.html

相关文章

dubbo的安装和使用

转自 : http://blog.csdn.net/songjinbin/article/details/26006621 背景 (#) 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊…

订单系统开发(仿淘宝和美团网) 之 项目总结(一)

基于公司战略的调整和开发框架的升级换代,也伴随着SOP(面向服务编程)和SOA(面向服务架构)的软件开发思想在公司开发团队中的慢慢深入,最终讨论决定在将现有(旧)的支撑公司业务的项目模块(如:产品,商家和订单...)在进行底层架构升级…

docker 集群三 (etcd+flannel) 上

挺不喜欢讲原理的东西的,自己看书比谁讲的都好,贴一个集群的图共理解。 . 下载安装包首先下载etcd安装包和flannel安装包,如果有人需要下载,请回复后续我上传到百度网 盘提供,当然也可以自己去网上找找。etcd-v3.2.10-…

深度解析利用ES6进行Promise封装总结

这篇文章主要介绍了如何利用ES6进行Promise封装总结,文中通过示例代码介绍的非常详细,写的十分的全面细致,具有一定的参考价值,对此有需要的朋友可以参考学习下。如有不足之处,欢迎批评指正。 原生Promise解析 简介 pr…

ZooKeeper系列之二:Zookeeper常用命令

转自 :http://blog.csdn.net/xiaolang85/article/details/13021339 ZooKeeper服务命令: 在准备好相应的配置之后,可以直接通过zkServer.sh 这个脚本进行服务的相关操作 1. 启动ZK服务: sh bin/zkServer.sh start2. 查看ZK服务状态: sh bin/zkServ…

day14_DBUtils学习笔记

一、DBUtils介绍 Apache公司开发的框架。 什么是dbutils?它的作用?   DBUtils是java编程中的数据库操作实用工具,小巧简单实用。   DBUtils封装了对JDBC的操作,简化了JDBC操作。可以少写代码。 commons-dbutils 是 Apache 组织提…

C#中指针使用总结

C#为了类型安全,默认并不支持指针。但是也并不是说C#不支持指针,我们可以使用unsafe关键词,开启不安全代码(unsafe code)开发模式。在不安全模式下,我们可以直接操作内存,这样就可以使用指针了。在不安全模式下&#x…

Hadoop 学习总结之一:HDFS简介

转自:博客园 觉先 Hadoop 学习总结之一:HDFS简介一、HDFS的基本概念 1.1、数据块(block) HDFS(Hadoop Distributed File System)默认的最基本的存储单位是64M的数据块。和普通文件系统相同的是,HDFS中的文件是被分成64M一块的数据块存储的。不…

JavaScript ES2019中的8个新功能

JavaScript一直在不断改进和添加更多新功能。TC39已经完成,并批准了ES2019的8项新功能。这个过程包含了5个阶段: 第0阶段:稻草人第1阶段:提案第2阶段:草案第3阶段:候选第4阶段:已完成/已批准 第…

Python常用模块资料

2019独角兽企业重金招聘Python工程师标准>>> 1.os模块 os模块包装了不同操作系统的通用接口,使用户在不同操作系统下,可以使用相同的函数接口,返回相同结构的结果。 os.name:返回当前操作系统名称(posix, nt, os2, mac…