创建Stack类的不同方法

读《学习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
}

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×

// tidio机器人助手