使用JavaScript浅谈栈
什么是栈?
你可以这样理解,栈就是一个装水的水桶,我们要取水的话只能从水桶的最上面取水,最先倒入水桶的水,是最后取出来的。
所以栈就是一种特殊的列表,栈内的元素只能通过列表的一端进行访问,这一端称为栈顶。栈被称为一种后入先出(LIFO,last-in-first-out)的数据结构。
我们来抽象一下栈的数据类型结构
dataSource (属性):用于存储栈的元素
size(属性):栈内元素的个数
clear(方法):清除所有的栈内元素
push(方法):向栈内添加元素
pop(方法):删除当前栈顶元素
peek(方法):显示当前栈顶元素
length(方法):返回栈内元素个数
根据上面的抽象定义我们得到栈类Stack
class Stack { constructor() { this.dataSource = []; this.size = 0; } // clear: 清除所有元素 clear() { this.dataSource.length = 0; this.size = 0; } // push:添加新元素 push(element) { this.dataSource[this.size++] = element; } // pop: 删除栈顶元素 pop() { if (this.size > 0) { return this.dataSource.splice(--this.size, 1); } return false; } //peek: 返回当前栈顶元素 peek() { if (this.size > 0) { return this.dataSource[this.size -1]; } } // length: 返回当前栈内元素个数 length() { return this.size; } }
我们根据这个栈类来实现一个判断字符串是否是回文的函数(如果一个字符串从左到右和从右到左是相等的话,那么这个字符串就是回文,例如‘aabbaa’)
代码如下:
class Stack { constructor() { this.dataSource = []; this.size = 0; } // clear: 清除所有元素 clear() { this.dataSource.length = 0; this.size = 0; } // push:添加新元素 push(element) { this.dataSource[this.size++] = element; } // pop: 删除栈顶元素 pop() { if (this.size > 0) { return this.dataSource.splice(--this.size, 1)[0]; } return false; } //peek: 返回当前栈顶元素 peek() { if (this.size > 0) { return this.dataSource[this.size - 1]; } } // length: 返回当前栈内元素个数 length() { return this.size; } } const str1 = 'aabbaa'; const str2 = 'aabbcc'; isPalindrome(str1); isPalindrome(str2); function isPalindrome(str) { const strArr = str.split(''); const stack = new Stack(); let newStr = ''; while (strArr.length) { stack.push(strArr.splice(0, 1)[0]); } while (stack.length()) { newStr += stack.pop(); } console.log(newStr); if (newStr === str) { console.log(str + ':是回文'); } else console.log(str + ':不是是回文'); }
源码和案例地址:https://gitee.com/mvc_ydb/data-structure/blob/master/stack.js
累积知识点,解决每一个遇到的问题,实现从量变到质变