JavaScript数据结构与算法—— 栈

news/2024/5/21 6:49:12

我们可以在数组的任何位置上删除或者添加元素,但有时候我们还需要在元素的添加或删除时有更多控制的数据结构,有两种数据结构类似于数组,但在添加或删除元素时更为可控,它们就是栈和队列。
本节主要介绍栈。

1.栈数据结构

栈是一种遵循后进先出(LIFO)原则的有序集合。新添加的或待删除的元素都保存在栈的同一端,叫做栈顶,另一端叫栈底。在栈中,新元素靠近栈顶,旧元素接近栈底。如下图所示:
clipboard.png

2.创建栈

// 首先创建一类表示栈
function Stack(){
    let items = []; // 选择数组来保存栈中的元素 
    //各种属性和方法
}

下面要为栈声明一些方法:

push()  //  添加一个或多个新元素到栈顶
pop()  //  移除栈顶元素,同时返回被移除的元素
peek()  // 仅仅返回栈顶元素,不对栈做任何修改
isEmpty()  //  如果栈中没有元素返回true,否则返回false
clear()  // 移除栈中所有元素
size()  // 返回栈中元素的个数(和数组length类似) 

2.1 向栈添加元素

this.push() = function(element) {
    items.push(element);
}

2.2 从栈移除元素

this.pop = function() {
    items.pop();
}

2.3 查看栈顶元素

this.peek = function() {
    return items[items.length - 1];
}

2.4 查看栈是否为空

this.isEmpty = function(){
    return items.length === 0;
}
this.size = function() {
    return items.lenght;
}

2.5 清空和打印栈元素

this.clear = function() {
    items = [];
} 
this.print = function() {
    console.log(items.toString());
}

经过上述的方法的添加,我们就完整的创建了一了个栈 Stack。

3.栈的应用—十进制转N进制

首先我们写出将十进制转为二进制:

function divideBy2(decNum) {
    var remStack = new Stack(),
        rem,
        binaryString = '';
    // 将十进制数除2的余数放入一个stack中    
    while(decNum > 0) {
        // 取余
        rem = Math.floor(decNum % 2);
        // 入栈
        remStack.push(rem);
        decNum = Math.floor(decNum / 2);
    }    
    // 从栈中取出转化为字符串然后连接起来构成二进制
    while(!remStack.isEmpty()) {
        // 出栈
        binaryString += remStack.pop().toString();
    } 
    return binaryString;
}

下面十进制转化N进制算法

function divideByN(decNum, n) {
    var remStack = new Stack(),
        rem,
        binaryString = '',
        digits = '0123456789ABCDEF';
    // 将十进制数除N的余数放入一个stack中    
    while(decNum > 0) {
        // 取余
        rem = Math.floor(decNum % n);
        // 入栈
        remStack.push(rem);
        decNum = Math.floor(decNum / n);
    }    
    // 从栈中取出转化为字符串然后连接起来构成二进制
    while(!remStack.isEmpty()) {
        // 出栈 使用digits方便在16进制中做个对应转化
        binaryString += digits[remStack.pop()];
    } 
    return binaryString;
}

http://www.niftyadmin.cn/n/2815561.html

相关文章

BZOJ2733[HNOI2012]永无乡——线段树合并+并查集+启发式合并

题目描述 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示。某些岛之间由巨大的桥连接,通过桥可以从一个岛 到达另一个岛。如果从岛 a 出发经…

Java并发48:并发集合系列-基于CAS算法的非阻塞双向无界队列ConcurrentLinkedDueue

[超级链接:Java并发学习系列-绪论] [系列序章:Java并发43:并发集合系列-序章] 原文地址:https://www.jianshu.com/p/602b3240afaf ConcurrentLinkedDeque 是双向链表结构的无界并发队列,从JDK 7开始加入到J.U.C的行列中&#xf…

jsp-EL表达式简介

表达式语言(Expression Language,EL),EL表达式是用"${}"括起来的脚本,用来更方便的读取对象! EL表达式主要用来读取数据,进行内容的显示! 使用EL表达式可以方便地读取对象中的属性、提…

Java并发49:并发集合系列-基于独占锁+链表实现的单向阻塞无界队列LinkedBlockingQueue

[超级链接:Java并发学习系列-绪论] [系列序章:Java并发43:并发集合系列-序章] 原文地址:http://www.importnew.com/25583.html 一、前言 前面介绍了使用CAS实现的非阻塞队列ConcurrentLinkedQueue,下面就来介绍下使用独占锁实现…

正式入驻CSDN博客

正式入驻CSDN博客,以前新浪博客文章会逐步搬过来,敬请期待。

在linux环境下重启oracle数据库,解决密码过期的问题

(1) 以oracle身份登录数据库,命令:su – oracle (2) 进入Sqlplus控制台,命令:sqlplus /nolog (3) 以系统管理员登录,命令:connect /as…

Java并发50:并发集合系列-基于独占锁实现的双向阻塞队列LinkedBlockingDeque

[超级链接:Java并发学习系列-绪论] [系列序章:Java并发43:并发集合系列-序章] 原文地址:http://ifeve.com/concurrent-collections-3/ 关于与LinkedBlockingDeque类似的单向队列LinkedBlockingQueue可以参考:Java并发49 使用阻…

hibernatenbsp;注解配置一对多关系

从Hibernate 2.5开始就可以使用annotation实现实体关系的映射了,减少了配置hbm文件的繁琐,而且annotation也是一种趋势,现在的SSH2的整合都是完全可以用annotation来实现。在以前实现一对多关联的关联式都是使用hbm文件,今天我们来…