栈的实现

实现一个栈,当务之急是决定存储数据的底层数据结构。这里采用的是数组。 我们的实现以定义 Stack 类的构造函数开始:

function Stack() {

this.dataStore = [];

this.top = 0;

this.push = push;

this.pop = pop;

this.peek = peek;

}

我们用数组 dataStore 保存栈内元素,构造函数将其初始化为一个空数组。变量 top 记录 栈顶位置,被构造函数初始化为 0,表示栈顶对应数组的起始位置 0。如果有元素被压入 栈,该变量的值将随之变化。先来实现 push() 方法。当向栈中压入一个新元素时,需要将其保存在数组中变量 top 所对 应的位置,然后将 top 值加 1,让其指向数组中下一个空位置。代码如下所示:

function push(element) {

this.dataStore[this.top++] = element;

}

这里要特别注意 ++ 操作符的位置,它放在 this.top 的后面,这样新入栈的元素就被放在 top 的当前值对应的位置,然后再将变量 top 的值加 1,指向下一个位置。pop() 方法恰好与 push() 方法相反——它返回栈顶元素,同时将变量 top 的值减 1:

function pop() {

return this.dataStore[--this.top];

}

peek() 方法返回数组的第 top-1 个位置的元素,即栈顶元素:

function peek() {

return this.dataStore[this.top-1];

}

如果对一个空栈调用 peek() 方法,结果为 undefined。这是因为栈是空的,栈顶没有任何

元素。

有时候需要知道栈内存储了多少个元素。length() 方法通过返回变量 top 值的方式返回栈 内的元素个数:

function length() {

return this.top;

}

最后,可以将变量 top 的值设为 0,轻松清空一个栈:

function clear() {

this.top = 0;

}

 

代码归纳

function Stack() {

this.dataStore = [];

this.top = 0;

this.push = push;

this.pop = pop;

this.peek = peek;

this.clear = clear;

this.length = length;

}

function push(element) {

this.dataStore[this.top++] = element;

}

function peek() {

return this.dataStore[this.top-1];

}

function pop() {

return this.dataStore[--this.top];

}

function clear() {

this.top = 0;

}

function length() {

return this.top;

}

栈的应用

数制间的相互转换

可以利用栈将一个数字从一种数制转换成另一种数制。假设想将数字 n 转换为以 b 为基数的数字,实现转换的算法如下。

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

  • 使用n/b代替n。

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

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

使用栈,在 JavaScript 中实现该算法就是小菜一碟。下面就是该函数的定义,可以将数字 转化为二至九进制的数字:

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;

}

转自: https://segmentfault.com/a/1190000004920420

作者:  Vagor

Javascript与数据结构系列(一)——栈的实现的更多相关文章

  1. <数据结构系列2>栈的实现与应用(LeetCode<有效的的括号>)

    首先想要实现栈,就得知道栈为何物,以下一段摘抄至百度百科: 栈(stack)又名堆栈,它是一种运算受限的线性表.其限制是仅允许在表的一端进行插入和删除运算.这一端被称为栈顶,相对地,把另一端称为栈底. ...

  2. 【C#数据结构系列】栈和队列

    一:栈 栈和队列也是线性结构,线性表.栈和队列这三种数据结构的数据元素以及数据元素间的逻辑关系完全相同,差别是线性表的操作不受限制,而栈和队列的操作受到限制.栈的操作只能在表的一端进行,队列的插入操作 ...

  3. Java数据结构系列之——栈(2):栈的链式存储结构及其操作

    package Stack; import LinkList.SinglyLinkList; public class LinkListStack { private SinglyLinkList&l ...

  4. Javascript与数据结构系列(二)——队列的实现

    队列实现 使用数组来实现队列看起来顺理成章.JavaScript 中的数组具有其他编程语言中没有的优点, 数组的 push() 方法可以在数组末尾加入元素,shift() 方法则可删除数组的第一个元素 ...

  5. JAVA数据结构系列 栈

    java数据结构系列之栈 手写栈 1.利用链表做出栈,因为栈的特殊,插入删除操作都是在栈顶进行,链表不用担心栈的长度,所以链表再合适不过了,非常好用,不过它在插入和删除元素的时候,速度比数组栈慢,因为 ...

  6. javascript实现数据结构与算法系列:栈 -- 顺序存储表示和链式表示及示例

    栈(Stack)是限定仅在表尾进行插入或删除操作的线性表.表尾为栈顶(top),表头为栈底(bottom),不含元素的空表为空栈. 栈又称为后进先出(last in first out)的线性表. 堆 ...

  7. 【JavaScript数据结构系列】03-队列Queue

    [JavaScript数据结构系列]03-队列Queue 码路工人 CoderMonkey 转载请注明作者与出处 1. 认识队列Queue结构 队列,跟我们的日常生活非常贴近,我们前面举例了食堂排队打 ...

  8. 【JavaScript数据结构系列】04-优先队列PriorityQueue

    [JavaScript数据结构系列]04-优先队列PriorityQueue 码路工人 CoderMonkey 转载请注明作者与出处 ## 1. 认识优先级队列 经典的案例场景: 登机时经济舱的普通队 ...

  9. 【JavaScript数据结构系列】02-栈Stack

    [JavaScript数据结构系列]02-栈Stack 码路工人 CoderMonkey 转载请注明作者与出处 ## 1. 认识栈结构 栈是非常常用的一种数据结构,与数组同属线性数据结构,不同于数组的 ...

随机推荐

  1. Windows 10 提权漏洞复现及武器化利用

    项目地址:https://github.com/SandboxEscaper/randomrepo 相关工具的下载地址: Process Explorer:https://docs.microsoft ...

  2. VRF实例说明

    Virtual Routing Forwarding       VPN路由转发表,也称VPN-instance(VPN实例),是PE为直接相连的site建立并维护的一个专门实体,每个site在PE上 ...

  3. Ceph的工作原理及流程

    本文将对Ceph的工作原理和若干关键工作流程进行扼要介绍.如前所述,由于Ceph的功能实现本质上依托于RADOS,因而,此处的介绍事实上也是针对RADOS进行.对于上层的部分,特别是RADOS GW和 ...

  4. 温故而知新-WebSocket 教程

    一.为什么需要 WebSocket? 初次接触 WebSocket 的人,都会问同样的问题:我们已经有了 HTTP 协议,为什么还需要另一个协议?它能带来什么好处? 答案很简单,因为 HTTP 协议有 ...

  5. 神奇的make自动生成include file的功能

    嗯,今天研究公司makefile的代码,始终搞不明白有一段下载编译依赖的rule recipe(对这个名词不了解请参考make的官方文档)是怎么执行的.明明在执行的时候并指定的target并没有依赖那 ...

  6. Django-2的路由层(URLconf)

    URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于客户端发来的某个URL调用哪一段逻辑代码 ...

  7. springboot 的定时任务使用

    定时任务在Spring Boot中的集成 在启动类中加入开启定时任务的注解: 在SpringBoot中使用定时任务相当的简单.首先,我们在启动类中加入@EnableScheduling来开启定时任务. ...

  8. Java开发WebService实例(1)

    参考文献:http://blog.sina.com.cn/s/blog_7bd0d6a70101dixc.html 简单的java工程实现 1 首先建立一个Java工程,在里面建一个Web servi ...

  9. Superset安装

    Superset version 1.8.5     # Install superset   pip install cairocffi   pip install superset     yum ...

  10. Apache Spark介绍及集群搭建

    简介 Spark是一个针对于大规模数据处理的统一分析引擎.其处理速度比MapReduce快很多.其特征有: 1.速度快 spark比mapreduce在内存中快100x,比mapreduce在磁盘中快 ...