因为不是计算机专业出身,对数据结构这些了解的比较少,最近看了一些相关的书籍,这里作一些总结。本篇要说的是栈。咱们都知道数组是JavaScript里面比较经常使用的一种数据结构,栈和数组相似,定义以下数组
栈是一种听从后进先出 (LIFO) 原则的有序集合。 新增长和待删除的元素都保存在栈的尾部,也称栈顶,相反的另外一端就叫栈底,在栈的这种数据结构里面,咱们新增的元素都在栈顶,旧的元素都在栈底。数据结构
举一个生活中的例子,咱们平时吃完饭洗盘子的时候,咱们都会把洗好的盘子一个个堆叠起来,先放进去的盘子就是咱们栈里面比较旧的元素(栈底),后放的盘子就是比较新的盘子(栈顶),而后咱们要把一个盘子拿下来的时候咱们都是从上面开始拿(栈顶),这里就是后放进去的盘子先拿出来了,因此这里就遵循了后进先出 (LIFO) 的原则了。this
代码所有采用ES6的语法,首先咱们定义一个类Stack
来表示栈,而后为该类实现一些方法来模拟栈的行为调试
class Stack { constructor() { // 定义一个数组来保存栈里面的元素 this.items = [] } // 添加元素到栈顶 push() { } // 从栈顶移除元素,同时返回被移除元素 pop() { } // 返回栈顶的元素,不对栈自己作修改 peek() { } // 判断栈是否为空 isEmpty() { } // 清空栈 remove() { } // 返回栈里面元素的个数 length() { } }
这样咱们就定义好一个基类了,下面来分别实现栈的行为方法code
咱们要实现的第一个方法(行为)就是push,push方法会向栈的栈顶新增元素,由于咱们是用数组来保存栈里面的元素的,因此这个方法的实现很简单,直接用JavaScript数组的push方法就行了。队列
push(item) { this.items.push(item) }
接下来要实现是pop方法(行为),pop会移除栈顶的元素而且会返回被移除的元素,这个方法咱们一样能够用JavaScript数组的pop方法来实现ip
pop() { return this.items.pop() }
peek方法(行为)返回栈顶的最后一个元素,不对栈自己作修改,咱们能够用Array.length-1
来获取数组的最后一个元素,因此peek方法能够这样写rem
peek() { return this.items[this.items.length-1] }
isEmpty方法用来判断栈是否为空,用数组来表示就是数组的 length 是否等于0,因此咱们能够得出以下代码it
isEmpty() { return this.items.length === 0 }
remove 方法用来清空栈里面全部的元素,实现这个方法是最简单的了,直接让数组等于一个新的空数组就行了console
remove() { this.items = [] }
最后要实现的是length方法,length方法返回栈的大小,这个一样能够用数组的length来实现
length() { return this.items.length }
这里咱们添加一个辅助print
方法来打印栈里面的元素,方便咱们观察调试,这个方法和栈的行为无关,只是一个辅助方法
print(){ this.items.forEach((item, index) => { console.log(`${index+1}:${item}`) }) }
最后完整的代码以下
class Stack { constructor() { this.items = [] // 定义一个数组来保存栈里面的元素 } // 添加元素到栈顶 push(item) { this.items.push(item) } // 从栈顶移除元素,同时返回被移除元素 pop() { return this.items.pop() } // 返回栈顶的元素,不对栈自己作修改 peek() { return this.items[this.items.length-1] } // 判断栈是否为空 isEmpty() { return this.items.length === 0 } // 清空栈 remove() { this.items = [] } // 返回栈里面元素的个数 length() { return this.items.length } print() { this.items.forEach((item, index) => { console.log(`${index+1}:${item}`) }) } }
这样这个栈就基本实现了,下面来实际运行一下实现好的这个Stack
类,首先咱们须要实例化这个类,而后分别调用实例的方法来查看效果
const myStack = new Stack() // 实例化 myStack.isEmpty() // true myStack.push('这是栈的第一个元素') myStack.push('这是栈的第二个元素') myStack.print() // 1: 这是栈的第一个元素 2:这是栈的第二个元素 myStack.peek() // 这是栈的第二个元素 myStack.pop() // 这是栈的第一个元素 myStack.length() // 1 myStack.isEmpty() // false myStack.remove() // 这时栈里面已经没有元素了 myStack.isEmpty() // true
栈的基本说明就到此了,下篇会总结一下和栈相似的数据结构,队列。