什么是栈?
你可以这样理解,栈就是一个装水的水桶,我们要取水的话只能从水桶的最上面取水,最先倒入水桶的水,是最后取出来的。
所以栈就是一种特殊的列表,栈内的元素只能通过列表的一端进行访问,这一端称为栈顶。栈被称为一种后入先出(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

被折叠的 条评论
为什么被折叠?



