zoukankan      html  css  js  c++  java
  • 使用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

  • 相关阅读:
    产品经理的未来在哪里
    如何打造一款成功的产品
    彻底解决Android 应用方法数不能超过65K的问题
    MVC,MVP 和 MVVM 的图示
    oracle最高账号sys的密码认证模式
    Android开发者必须深入学习的10个应用开源项目
    Android程序完全退出的三种方法
    Android-监听网络状态
    Android开发图片分辨率问题解决方案
    Android清除本地数据缓存代码
  • 原文地址:https://www.cnblogs.com/jsydb/p/12494548.html
Copyright © 2011-2022 走看看