JavaScript 版数据结构与算法(一)栈
今天,我们要讲的是数据结构与算法中的栈。
栈的简介
栈是什么?栈是一个后进先出(LIFO)的数据结构。栈有啥作用?栈可以模拟算法或生活中的一些后进先出的场景,比如:
- 十进制转二进制,你需要将余数倒序输出。
- 二叉树的先中后序非递归遍历都用到了栈。
- 在生活中,栈可以模拟煤炉与蜂窝煤等场景。
用 JavaScript 写一个栈类
对于 JavaScript 工程师来说,没必要在开发中实现一个栈。因为 JavaScript 的内置对象 Array 已经实现了栈的相关方法。不过,好的程序员不能光用别人设计好的方法,而不理解为啥这么设计,所以我们还是自己设计一个栈玩玩吧!
我们使用构造器函数来模拟类,不了解构造器函数的同学可以看《在 JavaScript 中使用构造器函数模拟类》这篇博客。
function Stack(){
...
}
module.exports = Stack;
私有变量
栈类的私有变量是个数组 items
,用于记录栈的元素。栈类实例化生成的对象不能直接操作 items
,因为 items
在函数外面是不可见的,你只能通过一些类方法沿着作用域链来间接操作 items
。
function Stack() {
// 私有变量 items,用于记录数组,对象不能直接操作
var items = [];
}
实现 push 、pop和 toString 方法
实现 push
、pop
和 toString
方法,跑通如下测试:
// 实例化一个 stack 对象
var stack = new Stack();
stack.push(5);
stack.push(8);
// 期望 stack 转化成的字符串为'5,8'
expect(stack.toString()).toBe('5,8');
// 期望 stack 删除并返回的是8
expect(stack.pop()).toBe(8);
// 期望 stack 转化成的字符串为'5'
expect(stack.toString()).toBe('5');
单元测试有时候就是可以作为需求文档来用的,在测试驱动开发(TDD),往往都是先写测试,再写代码。本教程用了 Jest 来进行单元测试,如果你不了解 Jest 和单元测试,可以先看《Jest 单元测试入门》这篇博客。
push
、pop
和 toString
方法 与 Array 自带的 push
、pop
和 toString
方法一样,所以实现代码如下:
function Stack() {
// 私有变量 items,用于记录数组,对象不能直接操作
var items = [];
// 类方法 push,在数组末尾添加项,对象可以直接调用
this.push = function (element) {
items.push(element);
};
// 删除并返回数组末尾的项
this.pop = function () {
return items.pop();
};
// 将数组转为字符串并返回
this.toString = function () {
return items.toString();
};
}
实现 peek 、isEmpty、clear、size 方法
实现 peek
、isEmpty
、clear
、size
方法,跑通如下测试:
// 实例化一个 stack 对象
var stack = new Stack();
stack.push(5);
stack.push(8);
// 期望 stack 最后一项是8
expect(stack.peek()).toBe(8);
// 期望 stack 的长度为2
expect(stack.size()).toBe(2);
// 期望 stack 不为空
expect(stack.isEmpty()).toBeFalsy();
stack.clear();
// 期望 stack 长度为0
expect(stack.size()).toBe(0);
上述方法比较简单,直接上代码:
function Stack() {
// 私有变量 items,用于记录数组,对象不能直接操作
var items = [];
// 查看数组最后一项
this.peek = function () {
return items[items.length - 1];
};
// 判断数组是否为空
this.isEmpty = function () {
return items.length == 0;
};
// 清空数组
this.clear = function () {
items = [];
};
// 返回数组长度
this.size = function () {
return items.length;
};
}
至此,栈的编写就完成了。
教程示例代码及目录
示例代码:https://github.com/lewis617/javascript-datastructures-algorithms
目录:http://www.liuyiqi.cn/tags/数据结构与算法/
JavaScript 版数据结构与算法(一)栈的更多相关文章
- JavaScript 版数据结构与算法(二)队列
今天,我们要讲的是数据结构与算法中的队列. 队列简介 队列是什么?队列是一种先进先出(FIFO)的数据结构.队列有什么用呢?队列通常用来描述算法或生活中的一些先进先出的场景,比如: 在图的广度优先遍历 ...
- JavaScript 版数据结构与算法(三)链表
今天,我们要讲的是数据结构与算法中的链表. 链表简介 链表是什么?链表是一种动态的数据结构,这意味着我们可以任意增删元素,它会按需扩容.为何要使用链表?下面列举一些链表的用途: 因为数组的存储有缺陷: ...
- JavaScript 版数据结构与算法(四)集合
今天,我们要讲的是数据结构与算法中的集合. 集合简介 什么是集合?与栈.队列.链表这些顺序数据结构不同,集合是一种无序且唯一的数据结构.集合有什么用?在 Python 中,我经常使用集合来给数组去重: ...
- javascript实现数据结构与算法系列:栈 -- 顺序存储表示和链式表示及示例
栈(Stack)是限定仅在表尾进行插入或删除操作的线性表.表尾为栈顶(top),表头为栈底(bottom),不含元素的空表为空栈. 栈又称为后进先出(last in first out)的线性表. 堆 ...
- JavaScript版EAN码校验算法
<script type="text/javascript"> $(document).ready(function () { $("#btnCalc&q ...
- JavaScript数据结构与算法(一) 栈的实现
TypeScript版本源码 class Stack { items = []; public push(element) { this.items.push(element); } public p ...
- 第一章:javascript: 数据结构与算法
在前端工程师中,常常有一种声音,我们为什么要学数据结构与算法,没有数据结构与算法,我们一样很好的完成工作.实际上,算法是一个宽泛的概念,我们写的任何程序都可以称为算法,甚至往冰箱里放大象,也要通过开门 ...
- 【Java数据结构学习笔记之二】Java数据结构与算法之栈(Stack)实现
本篇是java数据结构与算法的第2篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型 栈是 ...
- java数据结构与算法之栈(Stack)设计与实现
本篇是java数据结构与算法的第4篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型 栈是一种用于 ...
随机推荐
- 认识大明星——轻量级容器docker知识树点亮
docker是一个轻量级容器,属于操作系统层面的虚拟化技术,封装了文件系统(AUFS)以及网络互联,进程隔离等特性. 传统虚拟化架构: docker虚拟化架构: 可以看出,docker是没有Guest ...
- WPF DEV实现手风琴效果
说明 最近用WPF+DevExpress做项目时,需要做一个类似手风琴的效果,效果的界面如下.因为没有现成的控件,需要自定义模板,所以写了一个Demo和大家分享,项目中可以根据实际情况使用.如果你用不 ...
- JavaScript实现全选和全不选
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...
- spring整合mybatis错误:HTTP Status 404 - xxx-xxx....
运行环境:jdk1.7.0_17 + tomcat 7 + spring 3.2.0 +mybatis 3.2.7+ eclipse,访问路径:http://localhost:8085/Spring ...
- python--购物车优化
基本要求:用户入口1.商品信息存在文件里 2.已购商品.余额记录,长期保存, 即第一次启动是需要输入预算的,以后就拿剩下的钱买东西 商家入口 1.可以添加商品,删除商品,修改商品价格 2.按q可以退出 ...
- SNS团队Beta阶段第七次站立会议(2017.5.28)
1.立会照片 2.每个人的工作 成员 今天已完成的工作 罗于婕 对界面各部分的图标进行完善.美化 龚晓婷 对于历史记录功能进一步完善 林仕庄 对于历史记录功能进一步完善 刘海兰 协调界面的整体美化 念 ...
- 【Beta】阶段 第四次Daily Scrum Meeting
每日任务 1.本次会议为第四次 Meeting会议: 2.本次会议在周四下午16:40,课间休息时间在陆大楼召开,召开本次会议为10分钟. 一.今日站立式会议照片 二.每个人的工作 (有work it ...
- 【Alpha阶段】第五次scrum meeting
一.会议照片 二.会议内容 姓名 学号 负责模块 昨日任务完成度 今日任务 杨爱清 099 界面设计和交互功能 完成 去酷狗选择合适的轻音乐 杨立鑫 100 数据库搭建和其他 完成 继续对数据库进行编 ...
- Swing-JTable用法-入门
注:本文为学习笔记,原文为How to Use Tables,本文所有素材与代码均源于原文,可能会有部分更改. JTable是Swing中的表格控件,它的外观如下所示: 没错,excel或者acces ...
- 201521123061 《Java程序设计》第八周学习总结
201521123061 <Java程序设计>第八周学习总结 1. 本周学习总结 2. 书面作业 1.List中指定元素的删除(题目4-1) 1.1 实验总结 主要是应用到了list中的a ...