这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战
最近实在是太忙了,疫情期间在家办公,好处是可以多睡一会懒觉,但是生活和工作的界限变得模糊,效率日渐走低,下面进入正题,来说下关于---使用数组模拟栈-将十进制转换为二进制,过程中记录一些思考吧。
1.栈总结:
- 栈是一个后进先出的数据结构。所有后进先出的场景都可以考虑栈。
JavaScript中没有栈,但是可以用Array实现栈的所有功能。- 栈的常用操作:
- 入栈:
push - 出栈:
pop - 获取栈顶元素:
stack[stack.length -1]
- 入栈:
2.用ES6的class,封装一个Stack类,包括 push、pop、peek 方法。
关于es6的class类不清楚的可以移步笔者之前记录📝的一篇:juejin.cn/post/685457…
下面来看代码:
peek和pop的都是可以返回栈顶的元素,但是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循环的目的是为了反复执行语句或代码块