JavaScript实现栈结构(Stack)

156 阅读1分钟

萌新一个,学习一下。

数组是一个线性结构,并且可以在数组的任意位置插入和删除元素。而栈就是比较常见的受限的线性结构,栈的特点为先进后出,后进先出。

程序中的栈结构:

  • **函数调用栈:**函数套娃,后进先出。

  • **递归:**无限套娃,栈溢出。

栈常见的操作:

  • push(element):添加一个新元素到栈顶位置;

  • pop():移除栈顶的元素,同时返回被移除的元素;

  • peek():返回栈顶的元素,不对栈做任何修改(该方法不会移除栈顶的元素,仅仅返回它);

  • isEmpty():如果栈里没有任何元素就返回true,否则返回false;

  • size():返回栈里的元素个数。这个方法和数组的length属性类似;

  • toString():将栈结构的内容以字符串的形式返回。

封装栈类 代码实现一下

class Stack {
    constructor() {
        this.items = [];
    }
    // 1. 将元素压入栈
    push(element) {
        this.items.push(element)
    }
    // 2. 从栈中取出元素
    pop() {
        return this.items.pop()
    }
    // 3. 查看栈顶元素
    peek() {
        return this.items[this.items.length - 1]
    }
    // 4. 判断栈顶是否为空
    isEmpty() {
        return this.items.length === 0
    }
    // 5. 获取栈中元素的个数
    size() {
        return this.items.length
    }
    // 6. toString方法
    toString() {
        return this.items.join(',')
    }
}

let s = new Stack()
s.push(1)
s.push(2)
s.push(3)
console.log(s)
console.log(s.pop()) //3
console.log(s.peek()) //2
console.log(s.isEmpty()) //false
console.log(s.size()) //2
console.log(s.toString()) //1,2

栈结构的应用:

利用栈结构后进先出的特点封装十进至转换为二进至的函数

class Dec2Bin extends Stack {
    // 接收一个十进制的
    set(decNumber) {
        while (decNumber > 0) {
            super.push(decNumber % 2)
            decNumber = Math.floor(decNumber / 2)
        }
    }
    // 2.取值  
    take() {
        let binaryString = ''
        while (!super.isEmpty()) {
            binaryString += super.pop()
        }
        return binaryString
    }
}

let dec2bin = new Dec2Bin()
dec2bin.set(825)
console.log(dec2bin.take()) //1100111001

其他应用实例,七夕诶,懒得写了,睡觉睡觉。