开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 2 天,点击查看活动详情
栈
栈的概念
定义:只允许在一端进行插入或删除操作的线性表。
元素遵循原则:先进后出
封装一个栈
function Stack() {
this.item = []
// 将元素压入栈
Stack.prototype.push = function (element) {
this.item.push(element)
}
// 将元素从栈中取出,并返回取出值
Stack.prototype.pop = function () {
return this.item.pop()
}
// 查看栈顶元素
Stack.prototype.peek = function () {
return this.item.at(-1)
}
// 查看栈长度
Stack.prototype.length = function () {
return this.item.length
}
// toString
Stack.prototype.toString = function () {
let str = ''
this.item.forEach((item, index) => index == this.item.length - 1 ? str += item : str += item + ',')
return str
}
}
// 测试
const stack = new Stack()
stack.push(10)
stack.push(0)
stack.push(100)
stack.push(19)
console.log(stack); // Stack { item: [ 10, 0, 100, 19 ] }
console.log(stack.toString()); // 10,0,100,19
console.log(stack.peek()); // 19
console.log(stack.length()); // 4
使用栈:十进制转二进制
function decToBin(decNumber){
const stack = new Stack()
while(decNumber>0){
stack.push(decNumber%2)
decNumber = Math.floor(decNumber/2)
}
let num = ''
// 取数从栈顶开始取
while(stack.length()){
num+=stack.pop()
}
return num
}
console.log(decToBin(10));// 1010
集合
什么是集合?
集合通常由一组无序的,不能重复的元素构成的。
ES6中已经有了Set()类。
基础用法
- 创建
const set = new Set()
- 添加元素
set.add(1)
和数组不同的是,集合里面的数据不能有重复的,但是你添加重复的元素代码也不会报错,只是不添加进去罢了。
- 删除元素
set.delete(1)
会根据删除结果来返回true/false
- 清空集合内元素
set.clear()
- 检查集合内是否有该元素
因为集合是无序的,所以不能使用数组的api来检测
set.has(value)
- 循环集合
set.forEach(item => {
console.log(item);
})
- 输入内容
使用keys()和values()都可以
console.log(set.values()); // [Set Iterator] { 1, 10, 0 }
console.log(set.keys()); // [Set Iterator] { 1, 10, 0 }
- entries() 如果是对象调用,则返回一个数组,里面的每一数组都是对象的一个属性的键值。
集合调用,则是两个value
console.log(set.entries()); // [Set Entries] { [ 1, 1 ], [ 10, 10 ], [ 0, 0 ] }