《JavaScript数据结构与算法》笔记——第3章 栈
- 栈是一种后进先出(LIFO)的有序集合
- 函数创建栈
function Stack() { // 各种属性和方法的声明 item = [];// 需要一种数据结构来保存栈里的元素 // 为栈声明一些方法 /** * 添加一个或者几个新元素到栈顶 * @param element */ this.push = function (element) { item.push(element) }; /** * 移出栈顶的元素,同时返回被移出的元素 * @returns {*} */ this.pop = function () { return item.pop() }; /** * 返回栈顶的元素,不对栈做任何修改 * @returns {*} */ this.peek = function () { return item[item.length - 1] }; /** * 如果栈里没有任何元素就返回true,否则返回false * @returns {boolean} */ this.isEmpty = function () { return item.length === 0 }; /** * 移出栈里的所有元素 */ this.clear = function () { item = [] }; /** * 返回栈里的元素个数 * @returns {Array|number} */ this.size = function () { return item.length } }
- ES6语法声明
class Stack { constructor() { this.items = []; } push(element) { this.items.push(element) } // 其他方法 } /** * 由于根据原型实现,无法创建私有属性 */ /** * 改进1 * 使用ES6新增类型Symbol,基本类型,通常不可改变 * * ES6中Object.getOwnPropertySymbol()方法能够获取到类里面声明的所有Symbol属性,通过这个可以操作其他数组方法 */ let _items = Symbol(); class Stack { constructor() { this[_items] = []; } // Stack方法 push(element) { this[_items].push(element) } } let demo = new Stack(); let objSymbols = Object.getOwnPropertySymbols(demo); demo[objSymbols[0]].pop();// 可以访问未暴露的数组方法 /** * 改进2 * 使用WeakMap实现类(ES6新的集合类型,存储键值对,避开对数组方法的直接访问) */ let Stack = (function () {// 闭包使得外部无法访问WeekMap,达到私有目的,并且不会暴露其他未暴露的数组方法 const items = new WeakMap(); class InnerStack { constructor() { items.set(this, []) } push(element) { items.get(this).push(element) } pop() { return items.get(this).pop() } print() { return items.get(this).toString() } } return InnerStack })(); // 改进2 的方法使得子类无法继承私有属性
- 栈的应用:十进制转二进制
相关推荐
shenwenjie 2020-09-24
xiesheng 2020-08-02
mingyunxiaohai 2020-07-28
Cypress 2020-07-08
Cypress 2020-06-28
Dyancsdn 2020-06-27
Masimaro 2020-06-21
waitwolf 2020-06-21
Jasmineyaoyao 2020-06-16
OldBowl 2020-06-16
alicelmx 2020-06-16
Masimaro 2020-06-14
waitwolf 2020-06-08
nurvnurv 2020-06-05
ustbfym 2020-06-04
ziruoxiangyi 2020-06-03
范范 2020-06-03
Jasmineyaoyao 2020-05-31