读《学习JavaScript数据结构和算法》知识精简
本文内容:用JS模拟栈、用栈解决十进制转二进制
创建一个栈需要用一种数据结构来保存数据以及声明栈的一些方法
首先,用数组存数据
然后,声明如下方法
push(elem) :添加元素到栈顶
pop() :移除栈顶元素并返回
peek() :返回栈顶元素
isEmpty() :查看栈是否为空,返回true/false
clear() :移除栈里的所有元素
size() :返回栈里的元素个数
声明
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| let _items = Symbol() class Stack{ constructor(){ this[_items]=[] } push(elem){ this[_items].push(elem) } pop(){ return this[_items].pop() } peek(){ return this[_items][this[_items].length-1] } isEmpty(){ return this[_items].length==0 } size(){ return this[_items].length } clear(){ this[_items]=[] } }
|
这样就创建好的一个Stack类,但这里的数组是一个假的私有属性,因为ES6新增的Object.getOwnPropertySymbols方法能够取到类里面声明的所有Symbols属性,很容易被破坏。
用WeakMap实现类
1 2 3 4 5 6 7 8 9 10 11
| const items = new WeakMap() class Stack{ constructor(){ items.set(this,[]) } push(elem){ let s = items.get(this) s.push(elem) } //其他方法 }
|
用闭包把Stack类包起来
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| let Stack = (fucntion (){ const items = new WeakMap() class Stack{ constructor(){ items.set(this,[]) } push(elem){ let s = items.get(this) s.push(elem) } //其他方法 } return Stack }())
|
这样我们终于可以放心的new一个Stack了
用栈解决十进制转换二进制
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| function divideBy2(decNumber){ var remStack = new Stack(), rem, binaryString = ''
while(decNumber>0){ //只要商大于零就做此循环 rem = Math.floor(decNumber%2) //取余数 remStack.push(rem) decNumber = Math.floor(decNumber/2) //取商 } while(!remStack.isEmpty()){ binaryString += remStack.pop().toString() //出栈 } return binaryString }
|