javascript数据结构——栈
栈是一种高效的数据结构,数据只能在栈顶添加或删除,所以这样操作很快,也很容易实现。栈的使用遍布程序语言实现的方方面面,从表达式求值到处理函数调用。接下来,用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)进制数。转换算法如下。
最高位为 n % b,将此位压入栈。
使用 n/b 代替 n。
重复步骤 1 和 2,直到 n 等于 0,且没有余数。
持续将栈内元素弹出,直到栈为空,依次将这些元素排列,就得到转换后数字的字符串形式。
下面代码实现该算法。
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数据结构——栈相关推荐
- JavaScript数据结构——栈(Stack)
概念和结构 栈是一种后进先出(LIFO)的数据结构. 栈的第一个元素所在位置称为栈底,最后一个元素所在位置称为栈顶. 不包含任何元素的栈称为空栈. 栈的操作 栈有六种常用操作,分别为 入栈 push( ...
- javascript数据结构-栈
github博客地址 栈(stack)又名堆栈,它是一种运算受限的线性表.遵循后进先出原则,像垃圾桶似的. 功能实现依然按照增删改查来进行,内部数据存储可以借用语言原生支持的数组. 栈类 functi ...
- JavaScript数据结构——图的实现
在计算机科学中,图是一种网络结构的抽象模型,它是一组由边连接的顶点组成.一个图G = (V, E)由以下元素组成: V:一组顶点 E:一组边,连接V中的顶点 下图表示了一个图的结构: 在介绍如何用Ja ...
- 学习JavaScript数据结构与算法(一):栈与队列
本系列的第一篇文章: 学习JavaScript数据结构与算法(一),栈与队列 第二篇文章:学习JavaScript数据结构与算法(二):链表 第三篇文章:学习JavaScript数据结构与算法(三): ...
- JavaScript数据结构与算法(1)(数组、栈、队列、链表)(ES6)
注意:原教学视频:JavaScript(ES6)数据结构和算法 | JavaScript数据结构与算法 (都是CoderWhy老师的教学) 原作者(笔记)链接:JavaScript 数据结构与算法 | ...
- 5分钟教会学妹使用JavaScript栈解决问题(三)【JavaScript数据结构与算法系列】
本文目录 一.用栈解决问题的领域 二.从十进制到二进制 三.进制转换算法 四.本章小结 五.写在后面 一.用栈解决问题的领域 在上一篇文章中,我们了解并学习了JavaScript使用不同的方法来定义栈 ...
- 学习javascript数据结构(三)——集合
前言 总括: 本文讲解了数据结构中的[集合]概念,并使用javascript实现了集合. 原文博客地址:学习javascript数据结构(三)--集合 知乎专栏&&简书专题:前端进击者 ...
- 为什么我要放弃javaScript数据结构与算法(第二章)—— 数组
第二章 数组 几乎所有的编程语言都原生支持数组类型,因为数组是最简单的内存数据结构.JavaScript里也有数组类型,虽然它的第一个版本并没有支持数组.本章将深入学习数组数据结构和它的能力. 为什么 ...
- JavaScript数据结构和算法简述——数组
为什么先讲数组 数据结构可以简单的被分为线性结构和非线性结构. 线性结构大致包括: 数组(连续存储): 链表(离散存储): 栈(线性结构常见应用,由链表或数组增删和改进功能实现): 队列(线性结构常见 ...
- JavaScript数据结构和算法简述——前言
为什么要使用数据结构和算法(程序=数据结构+算法) 数据结构是对在计算机内存中(有时在磁盘中)的数据的一种安排.包括数组.链表.栈.二叉树.哈希表等. 算法是对这些结构中 ...
最新文章
- R语言使用compareGroups包绘制分组患者基线信息表实战:基于survival包lung数据集
- VC++调试程序、快捷键以及Debug版本与Release版本
- linuxsed替换字符串后保存_字符串方法——replace()
- Go语言 XML生成和解析
- oracle外网监听端口,oracle 11g 修改默认监听端口1521
- 使用Forge,WildFly Swarm和Arquillian开发微服务
- C++学习之路 | PTA乙级——1092 最好吃的月饼 (20 分)(精简)
- C#LeetCode刷题之#217-存在重复元素(Contains Duplicate)
- 学影视模型还是游戏模型更有前景?
- antv图例出现分页_图例-自定义文本样式
- Oracle Flash Storage System新版手册集
- 2017美国数学建模MCM C题(大数据)翻译 “合作和导航”
- PVT论文精读:Pyramid Vision Transformer: A Versatile Backbone for Dense Predictionwithout Convolutions
- canvas 基础系列(一)之实现抽奖刮刮卡(橡皮擦)
- python检查https过期_Python实现HTTPS网站证书过期监控及更新
- 最新版Nginx安装教程来了,快来看看
- ATamp;T汇编格式
- 常见传感器的应用领域和工作原理
- 重拾编程之路--jeetcode(java)--ZigZag Conversion
- 奇虎360 2014校园招聘面试
热门文章
- IDENTITY_INSERT 设置为 OFF
- java生成字符_java中随机生成字符串的方法(三种)
- 信号量——内核信号量、POSIX信号量、system V信号量
- Markdown语言调整图片居中、大小
- exists sql用法_《SQL进阶教程》笔记(3)
- 并发情况下使用List,多线程操作List,CopyOnWriteArrayList的使用
- Collectors.averagingDouble()
- String转为byte[] ,byte[]转为String,byte[]与String的相互转换
- 1.2.3休眠(Sleeping)
- 数据库与表的操作之创建表(CREATE TABLE)