Bootstrap

javascript-数据结构[0]-栈的实现

数组的方式实现栈

// 基于数组的栈

class Stack {
    constructor() {
        // 开辟数组
        this.items = [];
    }
    // 方法
    // 添加数组元素
    push(element,...a) {
        this.items.push(element,...a);
    }
    // 弹出最后一个元素 并 移除
    pop() {
        return this.items.pop();
    }   
    // 返回最后一个元素
    peek() {
        return this.items[this.items.length-1];
    }
    // 返回是否为空
    isEmpty() {
        return this.items.length===0;
    }
    // 清空栈
    clear() {
        this.items = [];
    }
    // 返回数组的大小
    size() {
        return this.items.length;
    }
    // 遍历栈

}

// 测试栈类
const stack = new Stack();
console.log(stack.isEmpty());

// 压入元素 3 5 8
stack.push(3,5,8);
console.log(stack);
// 删除元素
stack.pop();
console.log('删除了栈顶元素');
console.log(`栈大小 ${stack.size()}`);
console.log(`栈顶元素 ${stack.peek()}`);
console.log(stack);
console.log('清除栈所有元素');
stack.clear();
console.log(stack);

对象的方式实现栈

// 对象方式实现 栈
class Stack {
    // #name = '小芳';
    constructor() {
        // 栈的大小
        this.count = 0;
        // 栈对象
        this.items = {};
    }
    // 入栈
    push(element,...a) {
        // this.items.this.count (这样看起来好懂一点,实际上是不能用点方法的)
        this.items[this.count] = element;
        // 入栈 栈的大小++
        this.count++;
        // 插入多个元素的情况
        for(let i=0;i<a.length;i++) {
            this.items[this.count] = a[i];
            this.count++;
        }
    }
    // 栈大小
    size() {
        return this.count;
    }
    // 判空
    isEmpty() {
        return this.count===0;
    }
    // 出栈
    pop() {
        // 先判断栈是否为空
        if( this.isEmpty()) {
            // 如果栈为空,则返回undefined
            return undefined;
        }
        // 栈不为空
        // 大小-1就是栈顶元素的下标
        this.count--;
        // 将栈顶元素取出来
        const result = this.items[this.count];
        // 删除栈顶元素
        delete this.items[this.count];
        // 返回栈顶元素的数值
        return result;
    }
    // 查看栈顶元素
    peek() {
        // 先判断栈是否为空
        if( this.isEmpty()) {
            // 如果栈为空,则返回undefined
            return undefined;
        }
        // 栈不为空
        return this.items[this.count-1];
    }
    // 清空栈
    clear() {
        // 直接删除
        this.count = 0;
        this.items = {};
        // pop方法
        /*
        while(!this.isEmpty()) {
            this.pop();
        }
        */
    }
    // 创建toString方法 **
    toString() {
        // 先判断栈是否为空
        if( this.isEmpty()) {
            // 如果栈为空,则返回undefined
            return undefined;
        }
        // 栈不为空
        // 因为我们是通过下标来存键值对的 this.items.0 也可以,但是后面的循环只能obj[]的方式
        let objString = `${this.items[0]}`;
        for(let i=1;i<this.count;i++) {
            objString = `${objString},${this.items[i]}`;
        }
        return objString;
    }
    // 测试 私有属性
    // getName() {
    //     return this.#name;
    // }
}

const stack = new Stack();
// 判空
console.log(stack.isEmpty());
console.log(stack);
// 入栈
console.log('入栈3 5 8');
stack.push(3,5,8);
console.log(stack);
// 出栈
console.log('出栈',stack.pop());
// toString
console.log(stack.toString());
// 清空栈
stack.clear()
console.log('清空栈',stack);
// 
// console.log(stack.getName());
;