使用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

posted @ 2020-03-14 21:44  只会一点前端  阅读(281)  评论(0编辑  收藏  举报