鱼C论坛

 找回密码
 立即注册
查看: 1658|回复: 0

[庖丁解牛] 0003 ¥ 用栈解决#十进制到二进制问题

[复制链接]
发表于 2018-4-3 15:31:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 不二如是 于 2018-4-3 15:31 编辑


                               
登录/注册后可看大图





上一节分析了栈的工作原理,栈的应用十分广泛。

回溯问题中,它可以存储访问过的任务或路径、撤销操作(后面会介绍~)。

既然我们了解了Stack类的用法,用它来解决一下十进制转二进制的问题。




十进制到二进制

Snip20180403_52.png


现实生活中,从9年义务教育开始,我们主要使用十进制。

但在计算机的世界中,二进制则是王道,因为计算机里面的所有内容都是用二进制数字表示的(0,1)。

要把十进制转换成二进制,可以用最常用的“满二进一”(十进制数字和2整除,直到结果为0),见上图所示。

我们用来实现上述过程。




开始前的准备

页面初始结构:
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <meta name="keywords" content="小甲鱼,Web开发,HTML5,CSS3,Web编程教学">
  7.     <meta name="description" content="《零基础入门学习Web开发》案例演示">
  8.     <meta name="author" content="鱼C工作室">
  9.     <title>鱼C-数据结构与算法(JavaScript)</title>
  10.     <script src="js/stack.js"></script>
  11. </head>
  12. <body>

  13. </body>
  14. </html>
复制代码


由于js本身没有栈,把咱们在01讲创建的栈,引入到页面中。

  1. <script src="js/stack.js"></script>
复制代码


stack.js:
  1. function Stack() {

  2.     let items = [];

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

  6.     this.pop = function(){
  7.         return items.pop();
  8.     };

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

  12.     this.isEmpty = function(){
  13.         return items.length == 0;
  14.     };

  15.     this.size = function(){
  16.         return items.length;
  17.     };

  18.     this.clear = function(){
  19.         items = [];
  20.     };

  21.     this.print = function(){
  22.         console.log(items.toString());
  23.     };

  24.     this.toString = function(){
  25.         return items.toString();
  26.     };
  27. }
复制代码


直接通过“var xxx = new Stack()”即可使用。

现在进行html标签部分的设计(No Why):
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <meta name="keywords" content="小甲鱼,Web开发,HTML5,CSS3,Web编程教学">
  7.     <meta name="description" content="《零基础入门学习Web开发》案例演示">
  8.     <meta name="author" content="鱼C工作室">
  9.     <title>鱼C-数据结构与算法(JavaScript)</title>
  10.     <script src="js/stack.js"></script>
  11. </head>
  12. <body>
  13. <p>输入十进制数字为:<span id="decimal"></span>等价于二进制:<span id="binary"></span></p>
  14. <script>
  15.     let decimal = prompt("请输入一个十进制数字");
  16.     document.getElementById("decimal").innerHTML = decimal;
  17. </script>
  18. </body>
  19. </html>
复制代码


这样按照需要输入的十进制数字就会写入到id为decimal的span中:
Apr-03-2018 15-06-39.gif





十进制转二进制算法编写

先来创建一个转换函数:
  1. function decimalToBinary(decNumber){
  2.     }
复制代码


decNumber是形参,接收输入的十进制数字。

现在初始化一个栈类和两个局部变量:
  1. let remStack = new Stack(), rem, binaryString = '';
复制代码


rem用来保存余数,binaryString用来保存转换后的结果。

循环条件默认decNumber(输入的十进制)大于0才可执行:
  1. while (decNumber > 0){
  2. rem = Math.floor(decNumber % 2);
  3. remStack.push(rem);
  4. decNumber = Math.floor(decNumber / 2);
  5.         }
复制代码


在这段while循环中,当输入值满足和2做整除的条件时,就会获得当前结果和2整除的余数(rem)。

然后放到(push)栈里。

接着让decNumber进行下一次整除。

上述过程中,我们通过JS自带的Math.floor函数让除法的操作返回整数部分。

现在可以进入收尾工作了:
  1. while (!remStack.isEmpty()){
  2. binaryString += remStack.pop().toString();
  3. }
  4. return binaryString;
复制代码


最后用pop方法把栈中的元素都移除,利用后进先出原理,把出栈的的元素变成连续的字符串。

将转换的二进制输出:
  1. let binary = decimalToBinary(decimal);
  2. document.getElementById("binary").innerHTML = binary;
复制代码


最终:
Apr-03-2018 15-30-15.gif


源代码: Archive.zip (1.13 KB, 下载次数: 2, 售价: 11 鱼币)





如果有收获,别忘了评分


                               
登录/注册后可看大图


这位鱼油,如果喜欢本系列学习笔记,请订阅 专辑&#9758;传送门)(不喜欢更要订阅



                               
登录/注册后可看大图

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-1 10:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表