javascript数据结构——栈

时间:2021-05-03 12:59:59

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

定义栈的操作

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

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

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

javascript数据结构——栈

栈的实现

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

function Stack() {
this.dataStore = []; //用来保存栈内元素的数组
this.top = 0; //top用来记录栈顶位置,初始化为0
this.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命令行,查看以上代码执行结果。

javascript数据结构——栈

  正是预期的结果。

栈的应用

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

  可以利用栈将一个数字从一种数制转化成另一种数制,例如数字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}`);

输出结果为

javascript数据结构——栈

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

javascript数据结构——栈的更多相关文章

  1. JavaScript数据结构——栈和队列

    栈:后进先出(LIFO)的有序集合 队列:先进先出(FIFO)的有序集合 --------------------------------------------------------------- ...

  2. JavaScript数据结构——栈的实现

    栈(stack)是一种运算受限的线性表.栈内的元素只允许通过列表的一端访问,这一端被称为栈顶,相对地,把另一端称为栈底.装羽毛球的盒子是现实中常见的栈例子.栈被称为一种后入先出(LIFO,last-i ...

  3. JavaScript数据结构——栈的实现与应用

    在计算机编程中,栈是一种很常见的数据结构,它遵从后进先出(LIFO——Last In First Out)原则,新添加或待删除的元素保存在栈的同一端,称作栈顶,另一端称作栈底.在栈中,新元素总是靠近栈 ...

  4. javascript数据结构-栈

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

  5. JavaScript数据结构——队列的实现

    前面楼主简单介绍了JavaScript数据结构栈的实现,http://www.cnblogs.com/qq503665965/p/6537894.html,本次将介绍队列的实现. 队列是一种特殊的线性 ...

  6. JavaScript数据结构——字典和散列表的实现

    在前一篇文章中,我们介绍了如何在JavaScript中实现集合.字典和集合的主要区别就在于,集合中数据是以[值,值]的形式保存的,我们只关心值本身:而在字典和散列表中数据是以[键,值]的形式保存的,键 ...

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

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

  8. javascript数据结构

    学习数据结构非常重要.首要原因是数据结构和算法可以很高效的解决常见问题.作为前端,通过javascript学习数据结构和算法要比学习java和c版本容易的多. 在讲数据结构之前我们先了解一下ES6的一 ...

  9. 学习javascript数据结构(一)——栈和队列

    前言 只要你不计较得失,人生还有什么不能想法子克服的. 原文地址:学习javascript数据结构(一)--栈和队列 博主博客地址:Damonare的个人博客 几乎所有的编程语言都原生支持数组类型,因 ...

随机推荐

  1. <<< Tomcat 部署项目There are no resources that can be added or removed from the server

    错误信息:没有资源可以添加或删除的服务器 解决方式: 方式1.选中项目右键——找到Project Facets——勾选Dynamic Web Project和java 方式2.新建一个同名web项目, ...

  2. Java数组的一些基本算法

    数组的一些算法问题:  排序:(升序)   选择排序:     求每一轮的最小值:再输出   冒泡排序:     相邻的两个数相比较,把两个数相比较,第一个大于好面的就交换位置   shell排序: ...

  3. C#不同窗体间通信,数据传递

    在一个项目中,很多时候都需要在窗体间进行数据传递和通信,最觉见的是父子窗体之间的数据传递,比如登录ID,各个窗体都需要知道.有很多文章都写了这方面的问题,提出很多优秀的方法,鄙人不才,搜了一些资料之后 ...

  4. ExtJS学习之路第五步:认识最常见组件Panel

    文档中描述 Panel(面板)是一个容器,它具有特定的功能和结构部件,这使它成为面向应用用户界面的完美基石.面板,继承自Ext.container.Container,能够配置布局以及子组件(Chil ...

  5. oracle 分组后取每组第一条数据

    ‘数据格式 分组取第一条的效果 sql SELECT * FROM (SELECT ROW_NUMBER() OVER(PARTITION BY x ORDER BY y DESC) rn, test ...

  6. 关于vue的npm run dev和npm run build

    ├─build │ ├─build.js │ ├─check-versions.js │ ├─dev-client.js │ ├─dev-server.js │ ├─utils.js │ ├─vue- ...

  7. protobuf高效传输对比json gizp等等

    https://blog.csdn.net/u013929284/article/details/72582215 利用Protocol Buffers可以很好的解决JSON数据在传输方面的不足,它是 ...

  8. React.js 小书 Lesson25 - 实战分析:评论功能(四)

    作者:胡子大哈 原文链接:http://huziketang.com/books/react/lesson25 转载请注明出处,保留原文链接和作者信息. (本文未审核) 目前为止,第二阶段知识已经基本 ...

  9. 一次IPC无法创建的问题

    背景说明:         后台子系统都是运行在pc上的linux         系统有多个子系统,有一个子系统负责统一启停其他子系统,这里把这个子系统称为olddriver.         ol ...

  10. 摄像头模组光学CRA(chief ray angle)

    http://blog.csdn.net/sylorchen/article/details/54618874 Lens CRA CRA(Chief Ray Angle):从镜头的传感器一侧,可以聚焦 ...