资讯专栏INFORMATION COLUMN

我对JS栈的简单学习

Cobub / 2019人阅读

摘要:我对栈的学习因为是个新手,所以都是最简单的知识学习梳理。栈是一种遵从后进先出原则的有序集合,新添加的或者待删除的元素都保留在栈的末尾,称作栈顶,另一端叫做栈底。栈的学习栈的创建创建一个类来表示栈。对于栈来说只能用和方法来进行添加和删除元素。

我对栈的学习

因为是个新手,所以都是最简单的知识学习梳理。

什么是栈

数组是计算机科学中最常用的数据结构,是数据元素的集合。有时候我们需要一种添加或者删除元素时更可控的数据结构,他们就是队列和栈。

队列是遵从先进先出(FIFO)原则的一组有序的项,队列在尾部添加新元素,并从顶部移除元素。这里不先详细说明。

栈是一种遵从后进先出(LIFO)原则的有序集合,新添加的或者待删除的元素都保留在栈的末尾,称作栈顶,另一端叫做栈底。新元素都在栈顶。

栈也被用在编译语言的编译器和内存中保存变量、方法调用等。

栈的学习

栈的创建

创建一个类来表示栈。

function Stack() {
    //各种属性和方法的声明
}

需要一种数据结构来保存栈里的元素,这里选择数组。

var items = [];

栈的基本操作

入栈方法:添加元素到栈,这里要注意添加到栈的元素只能到栈顶,也就是栈的末尾。

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

出栈方法:移除栈里的元素,注意移除的是最后添加进去的元素。

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

对于栈来说只能用push和pop方法来进行添加和删除元素。

获取栈顶元素:我们想知道最后添加的元素是什么

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

别忘了这里我们使用数组来存储栈内的元素

判断栈空:栈为空返回true。

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

对于集合,最好是使用size来代替length,这里我们简单了。

清空栈:移除栈内的所有元素,把栈清空

this.clear = function () {
    items = []; //最简单的方式
}
栈的使用

首先需要初始化Stack类,然后验证一下栈是否为空

var stack = new Stack();
console.log(stack.isEmpty()); //true,此时还没有添加元素

然后添加元素入栈

stack.push(8);
stack.push(4);

获得最后添加的元素

console.log(stack.peek()); //4,因为4是最后被添加的元素

再添加一个元素

stack.push(11);
console.log(stack.size()); //输出3,此时栈里有3个元素
console.log(stack.isEmpty()); //false,此时栈里已经有元素了

移除两个元素

stack.pop();
stack.pop();
console.log(stack.size()); //1,此时只剩下一个元素
进制的转换

10进制转换为其他进制通常都是整除法。(可以自行搜索进制转换时的方法以及形式)

/**
 * [数字,转换成相应进制的进制数]
 * @param  {[Number]} decNumber [想转的数]
 * @param  {[Number]} base      [想转的进制]
 * @return {[Number]}           [转换进制后的数]
 */
function baseConverter (decNumber, base) {
    var remStack = new Stack(),
        rem,
        baseString = "",
        digits = "0123456789ABCDEF";

//将每次得到的进制数放入栈中
    while (decNumber > 0) {
        rem = Math.floor(decNumber % base);
        remStack.push(rem);
        decNumber = Math.floor(decNumber / base);
    }    

//后进先出,所以出栈刚好符合进制转换的形式
    while (!remStack.isEmpty()) {
        //这里通过digits的下标来获得相应字符。比如pop出7,这里digits[7]就是7,pop出16,这里digits[16]就是F
        baseString += digits[remStack.pop()];
    }

    return baseString;
}

baseConverter(100345, 2); //11000011111111001
baseConverter(100345, 8); //303771
baseConverter(100345, 16); //187F9

下一篇简单的学习队列。。。。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/86920.html

相关文章

  • 我对JS队列的学习

    摘要:我对队列的学习什么是队列队列是遵循先进先出原则的一组有序的项。最新添加的元素必须排在队列的末尾。队列的学习队列的操作其实是和栈是差不多的,但是队列只允许新数据在后端进行添加。这里是最小优先队列,优先值较小的元素被放置在队列最前面。 我对JS队列的学习 什么是队列 队列是遵循FIFO(先进先出)原则的一组有序的项。队列在尾部添加新元素,并从顶部移除元素。最新添加的元素必须排在队列的末尾。...

    Cristic 评论0 收藏0
  • JS数据结构学习:栈

    摘要:栈的应用前面介绍了那么多栈相关的知识,最后也是介绍栈的应用场景的时候了,栈的实际应用非常广泛,例如用来存储访问过的任务或路径撤销的操作。 栈的定义 什么是栈?栈是一种遵循后进先出原则的有序集合,新添加的或者待删除的元素都保存在栈的同一端,称为栈顶,另一端称为栈底,在栈里,新元素靠近栈顶,旧元素靠近栈底,用个图来看大概这样式的:showImg(https://segmentfault.c...

    Alfred 评论0 收藏0
  • 堆和栈

    摘要:百度百科上对堆和栈进行了对比分析堆栈空间分配栈操作系统由操作系统自动分配释放,存放函数的参数值,局部变量的值等。堆栈缓存方式栈使用的是一级缓存,他们通常都是被调用时处于存储空间中,调用完毕立即释放。显然,堆的效率比栈要低得多。 相信很多程序员对于堆和栈的概念,总是感觉很朦胧,感觉在哪里听过见过,并没有深交。 在计算机领域,堆栈是一个不容忽视的概念,我们编写的C语言程序基本上都要用到。但...

    lscho 评论0 收藏0
  • 我对JS字典的简单学习

    摘要:我对字典的简单学习字典的概念集合字典和散列表都可以来存储不重复的值。字典也被称为映射。中有集合类的实现,也有字典类的实现。相关操作方法实现方法,判断某个键值是否在这个字典中,有则返回。实现方法,将字典所有的值以数组的形式返回。 我对JS字典的简单学习 字典的概念 集合、字典和散列表都可以来存储不重复的值。在集合中我们使用[值,值]来保存,在字典和散列表中使用[键,值]来存储数据。 字典...

    CntChen 评论0 收藏0
  • Android 使用 SoftReference 解决 Activity 存栈的内存泄漏问题

    摘要:利用存栈的方式来所有这个方法目前来看是对我直接有效的,但是实际运行过程中,会报内存泄漏的异常,原因是我的会对每一个启动时进行添加,而当我某个时,里对应的无法被,这样导致我的内存开销增加了。原文地址使用解决存栈的内存泄漏问题我的博客时空路由器 当 Android 想要退出应用时,我们总是希望完全退出。但是 Android 并没有提供一个完全退出 App 的函数。 Google 上搜索了一...

    acrazing 评论0 收藏0

发表评论

0条评论

Cobub

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<