小学生数学题之"使用数组模拟栈-将十进制转换为二进制"

576 阅读2分钟

这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战

最近实在是太忙了,疫情期间在家办公,好处是可以多睡一会懒觉,但是生活和工作的界限变得模糊,效率日渐走低,下面进入正题,来说下关于---使用数组模拟栈-将十进制转换为二进制,过程中记录一些思考吧。

1.栈总结:

  • 栈是一个后进先出的数据结构。所有后进先出的场景都可以考虑栈。
  • JavaScript中没有栈,但是可以用Array实现栈的所有功能。
  • 栈的常用操作:
    • 入栈:push
    • 出栈:pop
    • 获取栈顶元素:stack[stack.length -1]

2.用ES6的class,封装一个Stack类,包括 push、pop、peek 方法。

关于es6class类不清楚的可以移步笔者之前记录📝的一篇:juejin.cn/post/685457…

下面来看代码:

  • peekpop的都是可以返回栈顶的元素,但是pop会将该元素从stack中剔除,而peek只是用来获取的。
class Stack{
  constructor(){
    this.arr = [];
    this.num = 0; 
  }
  //入栈
  push(item){
    this.arr.push(item);
    this.num++;
  }
  //出栈
  pop(){
    this.num --;
    return this.arr.pop();
  }
  //获取栈顶的值
  peek(){
    return this.arr[this.num - 1];
  }
  //栈的size
  size(){
    return this.num;
  }
  //清理栈
  clear(){
    this.arr = []
  }
}

3.使用数组模拟栈-将十进制转换为二进制

function divideTenByTwo(num){
  var stack = new Stack();
  var restNum;
  var resStr="";
  while(num>0){
    restNum = Math.floor(num%2);
    stack.push(restNum);
    num = Math.floor(num/2);
  };
  while(stack.size() > 0){
    resStr += stack.pop().toString();
  }
  return resStr;
}

思考:

首先要知道这个取余数的图:一个数想要转为二进制,那就是不断的➗2,取余数,到最后,将余数从下到上拼接起来,就是转换的结果。

之前陷入了误区,想用递归结合for循环或者数组的遍历函数去做,其实直接使用while循环,写好循环条件即可。for循环和while循环还是有区别的,这里简单的做下对比:

for循环和while循环区别:

语法上:

  • for循环语法为:for(变量 = 开始值;变量 <= 结束值;变量 = 变量 + 步进值) {需执行的代码 }
  • while循环的语法为:while (<条件>) {需执行的代码 }(while在循环条件上要求没有那么苛刻,而for循环需要的比较多)

使用目的上:

  • for循环的目的是为了限制循环体的执行次数,使结果更精确
  • while循环的目的是为了反复执行语句或代码块