JS栈结构的简单封装
栈:是一种遵循后进先出(Last In First Out / LIFO) 原则的一种有序集合。
新添加或者要删除的元素都会保存在栈的同一端,我们把它叫做栈顶,另外一端叫做栈底。
在栈中所有的新元素都接近栈顶,而所有的旧元素都接近栈底。
在我们的生活中也有很多类似于栈这种结构的例子:
我们将栈视作是一个容器,比如水杯。它只有一个入口和出口就是杯子的顶部(和我们的栈非常相似)。我们向杯子中放入5块同杯子直径大小的饼干,全部放入后我们开始取出饼干。大家会发现 你最先取出的饼干是最后放入的那块,正好也就符合了我们栈的特点(LIFO)
在编程世界中栈也被用来保存变量、方法调用等功能,也被用于浏览器的历史记录(比如浏览器的返回按钮)。
那么下面我们就使用JavaScript的类来创建一个我们的栈。
class Stack{
constructor(){
this.items = [];
}
}
我们需要一种方式来保存我们栈中的数据,从上面的代码可以看到,我这边选择的是数组。但是数组允许我们在任何位置添加或者删除元素,我们需要给元素添加和删除的位置有一个约束,让我们的数组能够遵循 后进先出(LIFO) 的原则。所以接下来需要给我们的栈再添加一些方法。
// 我们要实现的第一个功能是向栈中添加新元素
// 并且添加的新元素只能放再栈的顶部(也就是数组的尾部)
push(element) {
this.items.push(element);
}
// 应为数组的push方法也是将新元素添加到数组的尾部,所以使用数组push方法来实现
// 现在我们来为栈添加一个移除元素的方法
// 栈结构是遵循LIFO的原则,素以移除的元素是最后添加进去的元素
pop() {
return this.items.pop();
}
// 我们使用数组的push和pop两个函数就可以实现后进先出的原则了
// 继续为栈添加一些辅助功能
// peek方法用于查看栈顶的元素
peek() {
return this.items[this.items.length - 1];
}
// isEmpty方法用于检查栈是否为空
isEmpty() {
return !this.items.length;
}
// clear方法用于清空栈
clear() {
this.items = [];
}
// size方法用于查看栈中元素的数量
size() {
return this.items.length;
}
以上代码就已经实现了我们栈的功能。 接下来我们把它整理到一起来看一下。
class Stack {
constructor() {
this.items = [];
}
push(element) {
this.items.push(element);
}
pop() {
return this.items.pop();
}
peek() {
return this.items[this.items.length - 1];
}
isEmpty() {
return !this.items.length;
}
clear() {
this.items = [];
}
size() {
return this.items.length;
}
}
接下来就可以使用我们的 Stack 了
// 我们先来创建一个栈验证一下是否为空
const stack = new Stack(); // 新建一个栈
console.log(stack.isEmpty()); // true
// 继续向栈中添加2个元素
stack.push('hello');
stack.push('world');
// 此时我们调用peek方法查看栈顶的元素
console.log(stack.peek()); // 'world'
// 调用size方法查看一下元素的数量
console.log(stack.size()) // 2
// 继续向栈中添加元素
stack.push('.');
stack.push('JavaScript');
// 移出一个元素
console.log(stack.pop()); // 'JavaScript'
// 清空栈
stack.clear();
console.log(stack.size()); // 0
console.log(stack.isEmpty()); // true
最后,还有一些专业词汇希望大家能够掌握:
向栈中添加元素: 我们可以称其为 入栈、压栈、压入
从栈中移除元素: 我们可以称其为 出栈、弹出
相关文章:

记录CSS3 target伪类简介
CSS3 target伪类是众多实用的CSS3特性中的一个。它用来匹配文档(页面)的URI中某个标志符的目标元素。具体来说,URI中的标志符通常会包含一个”#”字符,然后后面带有一个标志符名称,比如#respond,target就是用来匹配ID为respond的元…

LeetCode实战:合并两个有序数组
题目英文 Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note: The number of elements initialized in nums1 and nums2 are m and n respectively.You may assume that nums1 has enough space (size that is greater o…

Java云托管服务的开支削减策略
\摘要\随着项目不断扩大,你需要将其迁移到更大的虚拟机上。但如果新虚拟机环境超出了你的需求则会产生额外开支。\相比虚拟机,容器具有更小的粒度,并且无需重启运行中的实例即可垂直扩展。\单体应用和历史遗留应用无需更改配置,即…

SpringBoot培训教程--史前文明之Spring简介
一. Spring之起源 1.你知道J2EE吗? 要说到Spring的历史起源,首先咱们要说说J2EE这个玩意儿。 J2EE在1999年和2000年的时候开始得到广泛实现,在J2EE中提出了”事务管理“等核心中间层标准化的概念,但是在实践中出现了各种问题,尤其…

利用外部命令Oralce数据库导入导出
1--数据库导出(exp) 首先进入命令行 导出数据库 在命令行中输入如下命令: exp c2j/c2jc2j filec:/table.dmp tablesjbitaku,jbitakum grantsy 然后按回车键 说明: c2j/c2jc2j 分别表示用户名,密码和服务名 file:输出文件的位置和文…

LeetCode实战:子集
题目英文 Given a set of distinct integers, nums, return all possible subsets (the power set). Note: The solution set must not contain duplicate subsets. Example: Input: nums [1,2,3] Output: [[3],[1],[2],[1,2,3],[1,3],[2,3],[1,2],[] ]题目中文 给定一组…

linux的挂载命令
在linux中所有的存储设备都必须挂载后才能使用,相当于windows的分配盘符 挂载命令 mount #查看系统中已经挂载好的设备 mount -a #根据/etc/fstab中的内容,自动挂载 /etc/fstab是系统开机的自动挂载文件 系统挂载时要自动检车测这个文件,如果…

软件测试需要学习什么技术
软件测试在近几年被很多企业都重视起来,互联网时代,APP种类越来越多,软件测试这一行业的发展前景是非常大的,那么想要学习软件测试需要学习什么技术呢?来看看下面的详细介绍。 软件测试需要学习什么技术? 每个软件在上线之前都离…

silverlight4.0 写文件不能设置默认文件名
Silverlight4.0 不提供SaveFileDialog的SafeFileName的写属性 Weve not exposed the "DefaultFileName" property on SaveFileDialog due to time constraints.Moe Elshall | Silverlight Development TeamMicrosoft Corporation等待5.0解决问题。转载于:https://www…

我是如何组织“算法刻意练习活动”的?
背景 在上个学期末,我们组织了一次团队的招新活动 – 如何加入 LSGO 软件技术团队?。 我们让预加入团队的同学在假期中完成以下两个任务之一: 学习 C# 语言: https://www.bilibili.com/video/av2357992/?p1学习 Python 语言&a…

[Ubuntu] ubuntu10.04系统维护之Wine的安装
在介绍安装wine之前,我想是有必要先介绍一下Wine的。当然,如果是Liunx的高手,我想是没必要看的,但是对于笔者这样的菜鸟级人物还是需要看一下的。 Wine是一款Liunx下的模拟器软件,但是Wine又不仅仅是一个模拟器软件&am…

Python培训教程:Python内置数据结构之双向队列
经常听说Python就是一门执行速度低的语言,可能是你的程序中使用了复杂的算法与数据结构,才会导致程序执行速率低的。在Python的标准库中提供了常见的数据结构工开发者使用,不仅执行速率比较快,还可以简化开发者的编程工作。下面我…

华为hybrid-vlan
华为hybrid-vlan、三层交换、DHCP拓扑:需求:1.路由器终结vlan2.交换机间以hybrid方式透传vlan3.PC以DHCP获取IP思路:1.PC的网关在路由器上2.配置hybrid-vlan3.配置DHCP步骤:路由器AR1:<Huawei>sy[Huawei]vlan 10…

android 按住拖动gallery防止马上加载数据导致gallery卡的方法
gallery菜单滑动有一个不好的效果就是每次经过中间的菜单都默认是被选中状态,同时会加载数据 以至于切换不流畅,有一种卡卡的感觉!!其实用线程来处理这个问题,一定的时间后如果选择的index值不变,说明已经稳…

LeetCode实战:买卖股票的最佳时机
背景 为什么你要加入一个技术团队?如何加入 LSGO 软件技术团队?我是如何组织“算法刻意练习活动”的?为什么要求团队的学生们写技术Blog 题目英文 Say you have an array for which the ith element is the price of a given stock on day …

HTML5培训教程:HTML5基础介绍
HTML5发展史: HTML5草案的前身名为 Web Applications 1.0,于2004年被WHATWG提出,于2007年被W3C接纳,并成立了新的 HTML 工作团队。 • HTML 5 的第一份正式草案已于2008年1月22日公布。HTML5 仍处于完善之中。然而,大部…

LeetCode实战:买卖股票的最佳时机 II
背景 为什么你要加入一个技术团队?如何加入 LSGO 软件技术团队?我是如何组织“算法刻意练习活动”的?为什么要求团队的学生们写技术Blog 题目英文 Say you have an array for which the ith element is the price of a given stock on day …

csdn模拟登陆
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出版、作者信息和本声明。否则将追究法律责任。http://blog.csdn.net/mayongzhan - 马永占,myz,mayongzhan 首先声明本模拟不稳定,有时会出现登陆不进去.模拟的原理请参考bl…

Xcode 创建.a和framework静态库(转)
最近因为项目中的聊天SDK,需要封装成静态库,所以实践了一下创建静态库的步骤,做下记录。 库介绍 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行。库分静态库和动态库两种。iOS中的静态库有 .a 和 .framework两…

软件测试培训需要学习什么
软件测试在近几年引起了很多人的关注,不少人都想要学习软件测试,零基础的学员都会选择报软件测试培训机构学习,那么软件测试需要学习什么呢?来看看下面的详细介绍。 软件测试培训需要学习什么? 软件测试需要学测试环境(网络环境,…

IL,Emit之OpCodes说明(备查)
名称说明Add将两个值相加并将结果推送到计算堆栈上。Add_Ovf将两个整数相加,执行溢出检查,并且将结果推送到计算堆栈上。Add_Ovf_Un将两个无符号整数值相加,执行溢出检查,并且将结果推送到计算堆栈上。And计算两个值的按位“与”并…

LeetCode实战:只出现一次的数字
背景 为什么你要加入一个技术团队?如何加入 LSGO 软件技术团队?我是如何组织“算法刻意练习活动”的?为什么要求团队的学生们写技术Blog 题目英文 Given a non-empty array of integers, every element appears twice except for one. Find…

610D - Vika and Segments(线段树+扫描线+离散化)
扫描线:http://www.cnblogs.com/scau20110726/archive/2013/04/12/3016765.html 看图,图中的数字是横坐标离散后对应的下标,计算时左端点不变,右端点加1,所以总的更新的区间是l到r-1。 也可以理解为1代表的是ÿ…

UI设计比较流行的插画类型和运用
在当代平面设计中,插画是颇为经常使用的展现性元素,是视觉转达的紧张对象。插画在设计作品中,每每用来指导、开导和出现消息,更有针对性地、视觉化地同用户举行交换。真正高效的插画必然是有针对性的,易于辨认的&#…

poj 2362 Square
#include <iostream> //参照poj 1011 sticks#include <algorithm>using namespace std;int sticks[20],visited[20];int flag,total;int t,seg;int cmp(const void* a,const void* b){return (*(const int*)b)-(*(const int *)a);}void solve(int k,int…

Java BIO、NIO、AIO
同步与异步 同步与异步的概念, 关注的是 消息通信机制 同步是指发出一个请求, 在没有得到结果之前该请求就不返回结果, 请求返回时, 也就得到结果了.比如洗衣服, 把衣服放在洗衣机里, 没有洗好之前我们一直看着, 直到洗好了才拿出来晾晒. 异步是指发出一个请求后, 立刻得到了回…

LeetCode实战:数组中的第K个最大元素
背景 为什么你要加入一个技术团队?如何加入 LSGO 软件技术团队?我是如何组织“算法刻意练习活动”的?为什么要求团队的学生们写技术Blog 题目英文 Find the kth largest element in an unsorted array. Note that it is the kth largest el…

热修复测试过程注意事项
软件测试行是近几年比较火热的技术岗位,想要学习软件测试的同学有很多,今天小编给你分析一下关于热修复测试过程注意事项的相关内容,如果你在一次测试中脱颖而出那将来的你一定很精彩! 基于tinker实际测试过程中遇到的问题,小编简…

LeetCode实战:存在重复元素
背景 为什么你要加入一个技术团队?如何加入 LSGO 软件技术团队?我是如何组织“算法刻意练习活动”的?为什么要求团队的学生们写技术Blog 题目英文 Given an array of integers, find if the array contains any duplicates. Your function…

oracle exec 和 call 区别
转自:http://helloaq.iteye.com/blog/221614 exec 和 call 执行一个procedure时, exec是sqlplus的命令,只能在sqlplus中使用。 call是sql命令,任何工具都可以使用转载于:https://www.cnblogs.com/zerocc/archive/2011/07/27/21189…