栈,集合

73 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 2 天,点击查看活动详情

栈的概念

定义:只允许在一端进行插入或删除操作的线性表。

元素遵循原则:先进后出

image.png

封装一个栈

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()类。

基础用法

  1. 创建
const set = new Set()
  1. 添加元素
set.add(1)

和数组不同的是,集合里面的数据不能有重复的,但是你添加重复的元素代码也不会报错,只是不添加进去罢了。

  1. 删除元素
set.delete(1)

会根据删除结果来返回true/false

  1. 清空集合内元素
set.clear()
  1. 检查集合内是否有该元素

因为集合是无序的,所以不能使用数组的api来检测

set.has(value)
  1. 循环集合
set.forEach(item => {
    console.log(item);
})
  1. 输入内容

使用keys()和values()都可以

console.log(set.values()); // [Set Iterator] { 1, 10, 0 }
console.log(set.keys()); // [Set Iterator] { 1, 10, 0 }
  1. entries() 如果是对象调用,则返回一个数组,里面的每一数组都是对象的一个属性的键值。

集合调用,则是两个value

console.log(set.entries()); // [Set Entries] { [ 1, 1 ], [ 10, 10 ], [ 0, 0 ] }