本文目录

  • 一、用栈解决问题的领域
  • 二、从十进制到二进制
  • 三、进制转换算法
  • 四、本章小结
  • 五、写在后面

一、用栈解决问题的领域

在上一篇文章中,我们了解并学习了JavaScript使用不同的方法来定义栈数据结构,那么本章就是使用JavaScript的栈数据结构来解决一些问题的举例。

栈的实际应用非常广泛。在回溯问题中,它可以存储访问过的任务或路径、撤销的操作(后面的章节会讲述如何应用这个例子)。Java和C#用栈来存储变量和方法调用,特别是处理递归算法时,有可能抛出一个栈溢出异常(后面的章节也会介绍)。

既然我们已经了解了Stack类的用法,不妨用它来解决一些计算机科学问题。本章就介绍如何解决十进制转二进制问题,以及任意进制转换的算法。

二、从十进制到二进制

现实生活中,我们主要使用十进制。但在计算科学中,二进制非常重要,因为计算机里的所有内容都是用二进制数字表示的(0和1))。没有十进制和二进制相互转化的能力,与计算机交流就很困难。

要把十进制转化成二进制,我们可以将该十进制数除以2(二进制是满二进一)并对商取整,直到结果是0为止。

举个例子,把十进制的数10转化成二进制的数字,过程大概是如下这样。


大学的计算机课一般都会先教这个进制转换。下面是对应的算法描述。

function decimalToBinary(decNumber){// 这里使用上一章节声明的栈类const remStack = new Stack();let number = decNumber;let rem;let binaryString = '';while(number > 0){ //{1}rem = Math.floor(number % 2); //{2}remStack.push(rem); //{3}number = Math.floor(number / 2); //{4}}while(!remStack.isEmpty()){   //{5}binaryString += remStack.pop().toString();}return binaryString;
}

在这段代码里,当除法的结果不为0时(行{1}),我们会获得一个余数,并放到栈里(行{2}、行{3})。然后让结果继续除以2(行{4})。

另外需注意:JavaScript有数值类型,但是它不会区分整数和浮点数。因此,要使用Math.floor函数仅返回除法运算结果的整数部分。

最后,用pop方法把栈中的元素都移除,把出栈的元素连接成字符串(行{5})。用刚才写的算法做一些测试,使用以下代码把结果输出到控制台里。

完整代码

class Stack {constructor() {this.count = 0;this.items = {};}push (element) {this.items[this.count] = element;this.count++;}size () {return this.count;}isEmpty () {return this.count === 0;}pop () {if (this.isEmpty()) {    // {1}return undefined;}this.count--;   //{2}const result = this.items[this.count]; //{3}delete this.items[this.count];    //{4}return result; //{5}}peek () {if (this.isEmpty()) {return undefined;}return this.items[this.count - 1];}clear () {this.items = {};this.count = 0;//当然我们也可以遵循LIFO原则,使用下面的逻辑来移除栈中所有的元素。// while(1this.isEmpty()){//         this.pop();// }}toString () {if (this.isEmpty()) {return '';}let objString = `${this.items[0]}`;   //{1}for (let i = 1; i < this.count; i++) { //{2}objString = `${objString},${this.items[i]}`; //{3}}return objString;}
}function decimalToBinary (decNumber) {// 这里使用上一章节声明的栈类const remStack = new Stack();let number = decNumber;let rem;let binaryString = '';while (number > 0) {   //{1}rem = Math.floor(number % 2); //{2}remStack.push(rem); //{3}number = Math.floor(number / 2); //{4}}while (!remStack.isEmpty()) { //{5}binaryString += remStack.pop().toString();}return binaryString;
}console.log(decimalToBinary(10));  //1010
console.log(decimalToBinary(233));  //11101001
console.log(decimalToBinary(1000)); //1111101000

运行一下看看

三、进制转换算法

进制转换算法我们可以修改之前的算法,使之能把十进制转换成基数为2~36的任意进制。除了把十进制数除以2转成二进制数,还可以传入其他任意进制的基数为参数,就像下面的算法这样。

function baseConverter (decNumber, base) {// 这里使用上一章节声明的栈类const remStack = new Stack();const digits = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'; //{6}let number = decNumber;let rem;let binaryString = '';//进制判断,需在范围内if(!(base >= 2 && base <= 36)){return '';}while (number > 0) {   rem = Math.floor(number % base); remStack.push(rem); number = Math.floor(number / base);}while (!remStack.isEmpty()) {binaryString += digits[remStack.pop()];   //{7}}return binaryString;
}

我们只需要改变一个地方。

在将十进制转成二进制时,余数是0或1;

在将十进制转成八进制时,余数是0 ~ 7;

但是将十进制转成十六进制时,余数是0~9加上A、B、C、D、E和F(对应10、11、12、13、14和15)。

因此,我们需要对栈中的数字做个转化才可以(行{6}和行{7})。因此,从十一进制开始,字母表中的每个字母将表示相应的基数。字母A代表基数11,B代表基数12,以此类推。
可以使用之前的算法,输出结果如下。

console.log(baseConverter(10345, 2));   //10100001101001
console.log(baseConverter(10345, 8));  //24151
console.log(baseConverter(10345, 16));  //2869
console.log(baseConverter(10345, 35));  //8FK

到这里的呢,本章的进制转换应用实例就差不多完了,其实除了本例子还有许多应用的场景,例如平衡圆括号和汉诺塔等。

若看过模板引擎源码,知道编译原理的朋友肯定也在里面看到了栈结构的应用,著名的mustache.js,还有vue的模板也是用到了栈的哦。

四、本章小结

本系列文章主要讲述JavaScript栈数据结构(Stack)类能解决什么问题,数据栈类的文章共三篇,本文也是第三篇。

从1 - 3篇的文章里,讲述了栈这一数据结构的相关知识。我们使用数组和一个JavaScript对象自己实现了栈,还讲解了如何用push和pop往栈里添加和移除元素。我们比较了创建Stack类的不同方法,并分别列举了优点和缺点。我们还学习了用栈来解决计算机科学中最著名的问题之一。

工欲善其事,必先利其器。

五、写在后面

这作为一个JavaScript栈数据结构的第三篇文章,主要目的是使用Stack来解决问题,本系列也会持续进行更新的。

剧透:下一章讲述队列。它和栈有很多相似之处,但有个重要区别:队列里的元素不遵循后进先出原则。

有问题请留言或者@博主,谢谢支持o( ̄︶ ̄)o~

感谢您的阅读,如果此文章或项目对您有帮助,若可以的话请给个一键三连吧!

GitHub有开源项目,需要的小伙伴可以顺手star一下!

GitHub: https://github.com/langyuxiansheng

5分钟教会学妹使用JavaScript栈解决问题(三)【JavaScript数据结构与算法系列】相关推荐

  1. 假设有搅乱顺序的一群儿童成一个队列_数据结构与算法系列之栈amp;队列(GO)...

    以下完整代码均可从这里获取 栈 栈的基本概念 「后进先出.先进后出就是典型的栈结构」.栈可以理解成一种受了限制的线性表,插入和删除都只能从一端进行 当某个数据集合只涉及在一端插入和删除数据,并且满足后 ...

  2. 栈和队列8 - 数据结构和算法30

    栈和队列8 让编程改变世界 Change the world by program 队列的顺序存储结构 为什么小甲鱼上节课说队列的实现上我们更愿意用链式存储结构来存储? 我们先按照应有的思路来考虑下如 ...

  3. python 栈实现 加减乘除_数据结构与算法(六):基于栈实现简单的四则运算

    栈,是一种操作受限的线性表,其操作规则为:后进者先出,先进者后出. 目录 题目需求: 给定一个字符串,形如"1+6*5/3-8",根据其内容,计算结果,此例结果为3. 解题思路: ...

  4. JavaScript (JS)常见数据结构与算法的封装

    栈结构的封装 // 封装一个栈function Stack (){this.items = []// 实现栈的基本操作// 1.将元素压入栈Stack.prototype.push = functio ...

  5. 重学数据结构与算法系列:这玩意叫跳表?

  6. 重学数据结构与算法系列:一文讲透贪心算法

  7. 重学数据结构与算法系列:链表及其应用

    引言 链表是非常常用的基础数据结构,我们经常把它和数组放在一起进行比较.那我们首先来看下这两个常用的数据结构各自的特点是什么吧. 我们在实际编程的时候,如果进行数组的定义,那么就需要向系统申请连续的内 ...

  8. [林大帅作品连载]第二回 环岛路绝景配绝音 俏学妹书店忆书院

    第二回 环岛路绝景配绝音 俏学妹书店忆书院     诗云:       漫言旧情心未冷,夜寂乱稿伴孤灯.              本意沈吟新人至,人生何处不相逢?        话接上回,林二抬头一 ...

  9. 资料分享:送你一本《数据结构与算法JavaScript描述》电子书!

    数据结构 是掌握计算机编程必须具备的技能.通常情况下,我想掌握一门编程语言所用的方法就是利用这门语言把数据结构中线性表.栈.队列.字符串.动态数字.整数集合.树.图.搜索.排序等涉及的算法全部写一遍. ...

最新文章

  1. linux+jmeter+python基础+抓包拦截
  2. STM32工作笔记0094---音乐播放器实验
  3. zookeeper教程,docker 安装,命令,python操作zookeeper,分布式队列,分布式锁
  4. CICD详解(五)——SVN安装与配置
  5. ios开发闹钟步骤_苹果快捷指令自动化(起床关闹钟后自动播放音乐)
  6. 中粮营销致远A6应用探秘:高速审批执行,营销策略落地
  7. 20210605:前期使用pyqt5做的操作流程界面化,涉及mysql代码写的太差,可以用函数复用减少代码
  8. 项目工作绩效数据、项目工作绩效信息、项目工作绩效报告
  9. 最牛叉的街机游戏合集 模拟器
  10. ztree通过ajax获取json并勾选checkbook
  11. scratch零基础
  12. 小米手机扩容教程_小米note手机扩容,16G升级64G
  13. 使用 Bumblebee 控制 NVIDIA 双显卡(ubuntu13.04-X64)
  14. Packet Tracer相关命令
  15. 数据挖掘的分析软件和展示工具
  16. 趣味计算机冷知识,19个科学趣味冷知识,你知道多少个
  17. LDO线性稳压器详解
  18. python人脸口罩识别_基于Python+OpenCV的人脸口罩识别检测
  19. eureka客户端报错:was unable to send heartbeat Cannot execute request on any known server
  20. 兰州商学院正式更名为兰州财经大学

热门文章

  1. 忆享聚焦|全球云计算市场份额、数字虚拟人、“元宇宙”实体店……近期行业热点速览
  2. 学生信息管理系统的登陆
  3. threejs全景图片展示
  4. 【Halcon 字符串与HTuple互转,double与HTuple互转,Mat与HObject互转】
  5. 数据库索引高频面试题:传智播客java基础入门第二版答案
  6. 亚马逊、Lazada、shopee、wish、ebay、速卖通、阿里国际站、mercari、newegg测评,补单自养号攻略(环境方案详解)
  7. linux操作系统读写文件操作(c语言)
  8. 方形图片使用QLabel显示成圆形
  9. MySql函数 - FIND_IN_SET函数
  10. MISRA-C那些事儿