栈是一种高效的数据结构,数据只能在栈顶添加或删除,所以这样操作很快,也很容易实现。栈的使用遍布程序语言实现的方方面面,从表达式求值到处理函数调用。接下来,用JavaScript实现一个栈的数据结构。

定义栈的操作

  栈作为一种特殊的列表,只能从一端来进行访问,就像一摞盘子,放只能放在上面,拿也只能从上面拿,所以栈是一种先入后出的一种数据结构。因为栈的这种特点,栈中任意不在栈顶的元素都无法访问,为了得到栈底的元素,必须把该元素之上的元素拿掉,把栈底的元素暴露在栈顶。栈还可以清空其内所有元素,也可以记录栈内元素的个数。

  综上,我们定义几个操作栈的方法。

  • push()    把元素添加到栈顶
  • pop()     把元素从栈顶删除
  • peek()    返回栈顶的元素
  • clear()    清空栈内元素
  • length()    栈内元素的个数

栈的实现

  实现栈,底层的数据结构采用数组,以定义栈的构造函数开始;

function Stack() {this.dataStore = [];         //用来保存栈内元素的数组this.top = 0;                   //top用来记录栈顶位置,初始化为0this.push = push;this.pop = pop;this.peek = peek;this.clear = clear;this.length = length;
}

  接下来实现push(),pop(),peek(),clear()和length()。

  • push()方法是,当向栈顶添加一个新元素时,在数组的记录栈顶的位置的top的位置添加这个值,添加完成top需要加1;
  • pop()正好与push()相反,需要top减1,但同时减1之后返回top位置的值,即已删除元素;
  • peek()直接返回数组top-1位置的元素,即栈顶元素就可以了;
  • clear() 直接把top值赋为0,直接清空栈;
  • length()直接返回top的值,栈顶位置即栈内元素个数

  看代码……

function push(element) {this.dataStore[this.top++] = element;   // 先在top位置加入元素,之后top加1
}function pop() {return this.dataStore[--this.top];   // top先减1,然后返回top位置的元素
}function peek() {return this.dataStore[this.top - 1];
}function clear() {this.top = 0;
}function length() {return this.top;
} 

栈的测试

  测试一下刚刚定义的栈。

const s = new Stack();
s.push('hello');
s.push('world');
s.push('javascript');
console.log(`栈内元素个数:${s.length()}`);
console.log(`栈顶元素为:${s.peek()}`);
let popped = s.pop();
console.log(`删掉的元素是:${popped}`);
console.log(`现在的栈顶元素是:${s.peek()}`);
s.push('vue');
console.log(`push后的栈顶元素:${s.peek()}`);
s.clear();
console.log(`清空后的长度:${s.length()}`);
s.push('react');
console.log(s.peek());

  借助node命令行,查看以上代码执行结果。

  正是预期的结果。

栈的应用

  下面把栈这种数据结构应用起来解决一些问题。有一些问题特别适合用栈来解决。比如进制转化。

  可以利用栈将一个数字从一种数制转化成另一种数制,例如数字n转换为以b(b为2~9)进制数。转换算法如下。

  1. 最高位为 n % b,将此位压入栈。

  2. 使用 n/b 代替 n。

  3. 重复步骤 1 和 2,直到 n 等于 0,且没有余数。

  4. 持续将栈内元素弹出,直到栈为空,依次将这些元素排列,就得到转换后数字的字符串形式。

  下面代码实现该算法。

function mulBase(num, base) {var s = new Stack();do {s.push(num % base);num = Math.floor(num /= base);} while (num > 0);var converted = "";while (s.length() > 0) {converted += s.pop();}return converted;
}let num1 = mulBase(125, 5);
let num2 = mulBase(87, 2);console.log(`125转成5进制:${num1}`);
console.log(`87转成2进制:${num2}`);

输出结果为

栈是一种比较简单的数据结构,关于栈的内容就写这么多吧!

转载于:https://www.cnblogs.com/chengzp/p/stack.html

javascript数据结构——栈相关推荐

  1. JavaScript数据结构——栈(Stack)

    概念和结构 栈是一种后进先出(LIFO)的数据结构. 栈的第一个元素所在位置称为栈底,最后一个元素所在位置称为栈顶. 不包含任何元素的栈称为空栈. 栈的操作 栈有六种常用操作,分别为 入栈 push( ...

  2. javascript数据结构-栈

    github博客地址 栈(stack)又名堆栈,它是一种运算受限的线性表.遵循后进先出原则,像垃圾桶似的. 功能实现依然按照增删改查来进行,内部数据存储可以借用语言原生支持的数组. 栈类 functi ...

  3. JavaScript数据结构——图的实现

    在计算机科学中,图是一种网络结构的抽象模型,它是一组由边连接的顶点组成.一个图G = (V, E)由以下元素组成: V:一组顶点 E:一组边,连接V中的顶点 下图表示了一个图的结构: 在介绍如何用Ja ...

  4. 学习JavaScript数据结构与算法(一):栈与队列

    本系列的第一篇文章: 学习JavaScript数据结构与算法(一),栈与队列 第二篇文章:学习JavaScript数据结构与算法(二):链表 第三篇文章:学习JavaScript数据结构与算法(三): ...

  5. JavaScript数据结构与算法(1)(数组、栈、队列、链表)(ES6)

    注意:原教学视频:JavaScript(ES6)数据结构和算法 | JavaScript数据结构与算法 (都是CoderWhy老师的教学) 原作者(笔记)链接:JavaScript 数据结构与算法 | ...

  6. 5分钟教会学妹使用JavaScript栈解决问题(三)【JavaScript数据结构与算法系列】

    本文目录 一.用栈解决问题的领域 二.从十进制到二进制 三.进制转换算法 四.本章小结 五.写在后面 一.用栈解决问题的领域 在上一篇文章中,我们了解并学习了JavaScript使用不同的方法来定义栈 ...

  7. 学习javascript数据结构(三)——集合

    前言 总括: 本文讲解了数据结构中的[集合]概念,并使用javascript实现了集合. 原文博客地址:学习javascript数据结构(三)--集合 知乎专栏&&简书专题:前端进击者 ...

  8. 为什么我要放弃javaScript数据结构与算法(第二章)—— 数组

    第二章 数组 几乎所有的编程语言都原生支持数组类型,因为数组是最简单的内存数据结构.JavaScript里也有数组类型,虽然它的第一个版本并没有支持数组.本章将深入学习数组数据结构和它的能力. 为什么 ...

  9. JavaScript数据结构和算法简述——数组

    为什么先讲数组 数据结构可以简单的被分为线性结构和非线性结构. 线性结构大致包括: 数组(连续存储): 链表(离散存储): 栈(线性结构常见应用,由链表或数组增删和改进功能实现): 队列(线性结构常见 ...

  10. JavaScript数据结构和算法简述——前言

    为什么要使用数据结构和算法(程序=数据结构+算法)         数据结构是对在计算机内存中(有时在磁盘中)的数据的一种安排.包括数组.链表.栈.二叉树.哈希表等.        算法是对这些结构中 ...

最新文章

  1. R语言使用compareGroups包绘制分组患者基线信息表实战:基于survival包lung数据集
  2. VC++调试程序、快捷键以及Debug版本与Release版本
  3. linuxsed替换字符串后保存_字符串方法——replace()
  4. Go语言 XML生成和解析
  5. oracle外网监听端口,oracle 11g 修改默认监听端口1521
  6. 使用Forge,WildFly Swarm和Arquillian开发微服务
  7. C++学习之路 | PTA乙级——1092 最好吃的月饼 (20 分)(精简)
  8. C#LeetCode刷题之#217-存在重复元素(Contains Duplicate)
  9. 学影视模型还是游戏模型更有前景?
  10. antv图例出现分页_图例-自定义文本样式
  11. Oracle Flash Storage System新版手册集
  12. 2017美国数学建模MCM C题(大数据)翻译 “合作和导航”
  13. PVT论文精读:Pyramid Vision Transformer: A Versatile Backbone for Dense Predictionwithout Convolutions
  14. canvas 基础系列(一)之实现抽奖刮刮卡(橡皮擦)
  15. python检查https过期_Python实现HTTPS网站证书过期监控及更新
  16. 最新版Nginx安装教程来了,快来看看
  17. ATamp;T汇编格式
  18. 常见传感器的应用领域和工作原理
  19. 重拾编程之路--jeetcode(java)--ZigZag Conversion
  20. 奇虎360 2014校园招聘面试

热门文章

  1. IDENTITY_INSERT 设置为 OFF
  2. java生成字符_java中随机生成字符串的方法(三种)
  3. 信号量——内核信号量、POSIX信号量、system V信号量
  4. Markdown语言调整图片居中、大小
  5. exists sql用法_《SQL进阶教程》笔记(3)
  6. 并发情况下使用List,多线程操作List,CopyOnWriteArrayList的使用
  7. Collectors.averagingDouble()
  8. String转为byte[] ,byte[]转为String,byte[]与String的相互转换
  9. 1.2.3休眠(Sleeping)
  10. 数据库与表的操作之创建表(CREATE TABLE)