zoukankan      html  css  js  c++  java
  • JS数据结构及算法(一) 堆栈

    最近在看《学习JavaScript数据结构与算法》这本书,感觉自己又涨知识了 哈哈... 现在将自己看的做个总结,也是巩固理解。

    栈:先进后出,新添加和待删除的元素都保存在栈顶。可以用数组的push方法入栈,pop出栈。

    class Stack {
    
        constructor () {
            this.items = [];
        }
    
        push(element){
            this.items.push(element);
        }
    
        pop(){
            return this.items.pop();
        }
    
        peek(){
            return this.items[this.items.length-1];
        }
    
        isEmpty(){
            return this.items.length == 0;
        }
    
        size(){
            return this.items.length;
        }
    
        clear(){
            this.items = [];
        }
    
        print(){
            console.log(this.toString());
        }
    
        toString(){
            return this.items.toString();
        }
    }
    

    栈的实际应用:二进制转十进制、十进制转换任意进制(二进制、八进制、十六进制);平衡圆括号、汉诺塔问题

    /**
     * 十进制转二进制
     * @param num --十进制数据
     * @returns {string} 转换后的二进制数
     */
    function devideBy2(num) {
        let stack = new Stack();
        let rem;
        let binaryStr='';
        while(num>0){
            rem = num%2;
            stack.push(rem);
            num = Math.floor(num/2);
        }
        while (!stack.isEmpty()){
            binaryStr +=stack.pop().toString();
        }
        return binaryStr;
    }
    
    /**
     * 十进制转换为任意进制
     * @param num
     * @param base
     * @returns {string}
     */
    function baseConvert(num,base) {
        let stack = new Stack();
        let rem;
        let baseStr='';
        let digit='0123456789ABCDEF';   //十六进制会转换
        while(num>0){
            rem = num%base;
            stack.push(rem);
            num = Math.floor(num/base);
        }
        while (!stack.isEmpty()){
            baseStr +=digit[stack.pop()];
        }
        return baseStr;
    }
    

    检查括号是否匹配:左括号入栈,当检测到右括号时,进行出栈,看出栈的左括号与右括号是否可以配对,以此类推,直到栈为空。

    /**
     * 括号配对
     * @param str 包含括号的字符串
     * @returns {boolean|*} 配对成功返回true,失败返回false
     */
    function checkSymbol(str) {
        let openers = '([{',
            closers = ')]}',
            balanced = true,
            index = 0,
            tmp,
            stack = new Stack(),
            arr = str.split('');
        while (balanced && index < arr.length) {
            if (openers.indexOf(arr[index]) !== -1) {
                stack.push(arr[index]); //左括号入栈
            }
            else {
                if (stack.isEmpty()) {
                    balanced = false;
                }
                else {
                    tmp = stack.pop();
                    if (openers.indexOf(tmp) !== closers.indexOf(arr[index])) {
                        balanced = false;
                    }
                }
    
            }
            index++;
        }
        return (balanced && stack.isEmpty());
    }
    

      

  • 相关阅读:
    Get distinct count of rows in the DataSet
    单引号双引号的html转义符
    PETS Public English Test System
    Code 39 basics (39条形码原理)
    Index was outside the bounds of the array ,LocalReport.Render
    Thread was being aborted Errors
    Reportviewer Error: ASP.NET session has expired
    ReportDataSource 值不在预期的范围内
    .NET/FCL 2.0在Serialization方面的增强
    Perl像C一样强大,像awk、sed等脚本描述语言一样方便。
  • 原文地址:https://www.cnblogs.com/jingmi-coding/p/9284377.html
Copyright © 2011-2022 走看看