JavaScript数据结构1——栈

110 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情

栈的定义

栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。——百度百科

简单讲,栈是一种遵循后进先出(LIFO,Last In First Out)原则的有序集合,如下图。生活中,可以发现,有很多栈的例子。例如:收纳箱,餐厅中堆放的盘子等

image.png

创建一个栈

class Stack {
    constructor(){
        // 因为js数组的特殊性,创建一个基于数组的栈
        this.items = [] 
    }
}

首先,我们声明一个Stack类,选择数组来保存栈中的数据。接下来,要为我们的栈定义一些方法

  • push :添加一个或多个元素到栈顶
  • pop :移除栈顶的元素,同时返回被移除的元素
  • top :返回栈顶的元素,不对栈进行任何处理
  • isNull :判断栈是否为空,如果为空返回true,否则返回false
  • clear :清空栈
  • size :返回栈的元素个数

push

push(...data){
    this.items.push(...data)
}

pop

pop(){
    return this.items.pop()
}

top

top(){
    return this.items[this.items.length - 1]
}

isNull

isNull(){
    return this.items.length === 0
}

clear

clear(){
    this.items = []
}

size

size(){
    return this.items.length
}

此时,我们的栈已经创建好了,完整代码如下:

class Stack {
    constructor(){
        this.items = [] 
    }
    push(...data){
        this.items.push(...data)
    }
    pop(){
        return this.items.pop()
    }
    top(){
        return this.items[this.items.length - 1]
    }
    isNull(){
        return this.items.length === 0
    }
    clear(){
        this.items = []
    }
    size(){
        return this.items.length
    }
}

const stack = new Stack()
console.log(stack.isNull()); //true
stack.push(1)
stack.push(2)
stack.push(3,4,5)
console.log(stack.size()); //5
console.log(stack.top());  //5
console.log(stack.pop());  //5
console.log(stack.top());  //4
console.log(stack.size()); //4
console.log(stack.isNull()); //false
stack.clear()
console.log(stack.isNull()); //true
console.log(stack.size()); //0

总结

今天我们简单的实现了栈的类,但是,基于数组实现的栈他的效率不是最高的。首先,数组中的元素是有序的,而为了保证元素有序排列,会消耗更多的内存空间。其次,操作数组的方法时间负责度大多为O(n),在数组元素过多时,消耗时间会比较久。那么,有什么优化的方案呢?答案是,有,采用对象来创建栈,我们下期实现,各位读者老爷可自行实现。