JavaScript数据结构之栈

187 阅读2分钟

什么是栈?

栈是一种遵从先进后出原则的有序集合。新添加或待删除的元素都保存在栈的同一端,称作栈顶,另一端叫做栈底。在栈中,新元素都接近栈顶,旧元素接近栈底。栈通常有两种存储方法:顺序存储结构和链式存储结构。

一个栈的基本功能

1、push 添加一个(或几个)新元素到栈顶
2、pop 溢出栈顶元素,同时返回被移除的元素
3、peek 返回栈顶元素,不对栈做修改
4、isEmpty 栈内无元素返回 true,否则返回 false
5、size 返回栈内元素个数
6、clear 清空栈

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

    // 向栈内压入元素
    push(value) {
        return this._stackArray.push(value)
    }

    // 弹出栈顶元素
    pop() {
        return this._stackArray.pop()
    }

    // 获取栈顶元素
    peek() {
        return this._stackArray[this._stackArray.length - 1]
    }

    // 判断栈是否为空栈
    isEmpty() {
        return !this._stackArray.length
    }

    // 返回栈内元素个数
    size() {
        return this._stackArray.length
    }

    // 清空栈内元素
    clear() {
        this._stackArray = []
    }
}

利用栈把十进制转换为任意进制(最高为16进制)

假设N为需要转换的数字,n为需要转换的进制;

/**
 * @desc N=120 n=8
 * N      N/n     N%n
 * 120     15      0
 * 15      1       7
 * 1       0       1
 * 
 * @desc 将目标值一次一次除以进制基数,得到的取整值为新目标值,记录下余数,直到目标值小于0,最后将余数逆序组合即可。利用栈,记录余数入栈,组合时出栈。
 * */

function baseConversion(num, base) {
    const stack = new Stack();
    // 最多只能转换16进制
    const TARGET = '0123456789ABCDEF';
    let result = [];

    while(num > 0) {
        // 记录每一次的余数
        stack.push(Math.floor(num%base))

        // 新的目标值
        num = Math.floor(num/base)
    }

    while(!stack.isEmpty()) {
        // 逆序组合
        result.push(TARGET[stack.pop()])
    }

    return result.join('')
}

利用栈实现队列

队列是先进先出,我们可以使用一个栈模拟出队,一个栈模拟入队。

class StackQueue {
    constructor() {
        // A模拟入队 B模拟出队
        this.stackA = new Stack()
        this.stackB = new Stack()
    }

    // 入队
    _stackPush(value) {
        return this.stackA.push(value)
    }

    // 出队
    _stackPop() {
        if(this.stackB.isEmpty() && !this.stackA.isEmpty()) {
            this._stackChange()
        }
        return this.stackB.pop()
    };

    // 把栈A元素压入栈B
    _stackChange() {
        while(!this.stackA.isEmpty()) {
            this.stackB.push(this.stackA.pop())
        }
    };
}