# 实现栈

栈是一种遵从 后进先出(LIFO)原则的有序集合。新添加或待删除的元素都保存在栈的同一端,称作栈顶,另一端就叫栈底。在栈里,新元素都靠近栈顶,旧元素都接近栈底。

栈有以下基本方法

  • push 添加一个(或几个)新元素到栈顶
  • 移除栈顶的元素,同时返回被移除的元素
  • peek():返回栈顶的元素,不对栈做任何修改(该方法不会移除栈顶的元素,仅仅返回它)
  • isEmpty():如果栈里没有任何元素就返回 true,否则返回 false。
  • clear():移除栈里的所有元素。
  • size():返回栈里的元素个数。该方法和数组的 length 属性很类似。

# 基于数组实现栈

class Stack {
    constructor() {
        this.items = []
    }

    /**
     * 添加一个(或几个)新元素到栈顶
     * @param {*} element 
     */
    push(...element) {
        this.items.push(...element)
    }

    /**
     * 移除栈顶的元素,同时返回被移除的元素
     */
    pop() {
        return this.items.pop()
    }

    /**
     * :返回栈顶的元素,不对栈做任何修改(该方法不会移除栈顶的元素,仅仅返回它)
     */
    peek() {
        return this.items[this.items.length - 1]
    }

    /**
     * 如果栈里没有任何元素就返回 true,否则返回 false。
     */
    isEmpty() {
        return this.items.length === 0
    }

    /**
     * 移除栈里的所有元素
     */
    clear() {
        this.items = []
    }

    /**
     * 返回栈里的元素个数。该方法和数组的 length 属性很类似。
     */
    size() {
        return this.items.length
    }
}

# 基于对象实现Stack


class Stack {
    constructor() {
        this.count = 0
        this.items = {}
    }

    /**
     * 添加一个(或几个)新元素到栈顶
     * @param {*} element 
     */
    push(element) {
        this.items[this.count] = element
        this.count++
    }

    /**
     * 移除栈顶的元素,同时返回被移除的元素
     */
    pop() {
        if (this.isEmpty()) {
            return undefined
        }
        this.count--
        const result = this.items[this.count]
        delete this.items[this.count]
        return result
    }

    /**
     * :返回栈顶的元素,不对栈做任何修改(该方法不会移除栈顶的元素,仅仅返回它)
     */
    peek() {
        if (this.isEmpty()) {
            return undefined
        }
        return this.items[this.count - 1]
    }

    /**
     * 如果栈里没有任何元素就返回 true,否则返回 false。
     */
    isEmpty() {
        return this.count === 0
    }

    /**
     * 移除栈里的所有元素
     */
    clear() {
        this.items = {}
        this.count = 0

        // 遵循 LIFO 原则,使用下面的逻辑来移除栈中所有的元素
        // while (!this.isEmpty()) {
        //     this.pop()
        // }
    }

    /**
     * 返回栈里的元素个数。该方法和数组的 length 属性很类似。
     */
    size() {
        return this.count
    }

    /**
     * 创建 toString 方法
     */
    toString() {
        if (this.isEmpty()) {
            return ''
        }
        let objString = this.items[0];
        for (let i = 1; i < this.count; i++) {
            objString = `${objString},${this.items[i]}`
        }
        return objString
    }
}

更新时间: 11/24/2020, 10:17:53 AM