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());
    }
    

      

  • 相关阅读:
    DevExpress 最最最基础踩坑(如何设置控件属性)
    Oracle如何创建数据库(使用图形化界面,顺便提一下UTF-8和ZB16GB字符集的问题)
    ElementUI el-dialog中嵌套子页面
    Oracle详细教程(触发器,事务,存储过程,锁,游标)
    和人事交谈下来的几点感悟
    Oracle Groupby分组缺少表达式解决方法
    leetcode973. 最接近原点的 K 个点(谈谈C#中的Icomparer,ComParer,IComparable)
    APP的闪退和无响应
    APP测试的主要内容
    python数据结构
  • 原文地址:https://www.cnblogs.com/jingmi-coding/p/9284377.html
Copyright © 2011-2022 走看看