前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >JavaScript 数据结构:栈和队列

JavaScript 数据结构:栈和队列

原创
作者头像
前端达人
发布于 2019-01-23 15:41:43
发布于 2019-01-23 15:41:43
64800
代码可运行
举报
文章被收录于专栏:前端达人前端达人
运行总次数:0
代码可运行

上周小编已经介绍了什么是数据结构,没看过的同学,可以点击《JavaScript 数据结构:什么是数据结构》,今天小编会和大家一起学习栈和队列。

Web开发中最常用的两种数据结构是栈和队列,真正理解和灵活使用的开发人员并不多。如果你是开发人员,这两个场景一定不陌生:文本编辑器的“撤销”操作是用栈组织数据;点击事件,就是用队列组织数据。

现在回想起来,这些结构我们早已用过,只是我们不太在意而已 ,作为开发者我们有多少次使用栈和队列?由于他们在设计中的普遍性和相似性,我们有必要深入理解。(文末有彩蛋,一定要看完哦)

栈是一种高效的数据结构,因为数据只能在栈顶添加或删除,所以这样的操作很快,而且容易实现。栈的使用遍布程序语言实现的方方面面。

一摞盘子是现实中最常见例子:只能从最上面取盘子,盘子洗净后,也只能摞在这一摞盘子的最上面。栈被称为一种后入先出(LIFO,last-in-first-out)的数据结构。 

为了提供一个更具技术性的堆栈示例,让我们一起回顾下文本编辑器的“撤销”操作。每次添加文本就会添加至文末,即压入堆栈底部(push())。最近的更改代表栈的顶部(peek()),如果用户想撤销最近的更改,堆栈的顶部将被删除,这个过程可以反复撤销(pop()),直到撤销成一个空白的文件!

如图所示,更能方便大家理解栈:

入栈(push):将数据保存到栈顶!

出栈(pop):将栈顶的数据弹出的操作。 

定义Stack类的构造函数

我们用数组 dataStore保存栈内元素,构造函数将其初始化为一个空数组。变量 top记录栈顶位置,被构造函数初始化为 0,表示栈顶对应数组的起始位置 0。如果有元素被压入栈,该变量的值将随之变化。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function Stack()
{
    this.dataStore=[];
    this.top =0;
    this.push =push;
    this.pop =pop;
    this.peek=peek;
    this.length=length; 
}

定义PUSH方法

当向栈中压入一个新元素时,需要将其保存在数组中变量 top所对应的位置,然后将 top值加 1,让其指向数组中下一个空位置。代码如下所示: 

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function push(element)
{
    this. dataStore[this.top++]=element;
}

定义pop方法

pop()方法恰好与 push()方法相反——它返回栈顶元素,同时将变量 top的值减 1:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function pop()
{
    return this.dataStore[--this.top];
}

定义peek方法

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function peek()
{
    return this.dataStore[this. top-1];
}

定义length方法

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function length()
{
    return this.top;
}

定义clear方法

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function clear() {
    this. top = 0;
}

完整的Stack类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function Stack()
{
    this.dataStore=[];
    this.top =0;
    this.push =push;
    this.pop =pop;
    this.peek=peek;
    this.length=length;
}
function push(element)
{
    this. dataStore[this.top++]=element;
}
function pop()
{
    return this.dataStore[--this.top];
}
function peek()
{
    return this.dataStore[this. top-1];
}
function length()
{
    return this.top;
}
function clear() {
    this.top=0;
}

队列

类似堆栈,队列是线性数据结构。与堆栈不同,队列只会删除最早添加的数据。

队列是一种列表,不同的是队列只能在队尾插入元素,在队首删除元素。队列用于存储按顺序排列的数据,先进先出,这点和栈不一样,在栈中,最后入栈的元素反而被优先处理。可以将队列想象成在银行前排队的人群,排在最前面的人第一个办理业务,新来的人只能在后面排队,直到轮到他们为止。

队列是一种先进先出( First-In-First-Out, FIFO)的数据结构。队列被用在很多地方,比如提交操作系统执行的一系列进程、打印任务池等,一些仿真系统用队列来模拟银行或杂货店里排队的顾客。 

如下图所示,很直观的展示了什么是队列:

队列的两种主要操作是:向队列中插入新元素和删除队列中的元素。插入操作也叫做入队,删除操作也叫做出队。入队操作在队尾插入新元素,出队操作删除队头的元素。 

定义Queue构造函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function Queue()
{
    this.dataStore=[];
    this.enqueue=enqueue;
    this.dequeue=dequeue;
    this.front=front;
    this.back=back;
    this.toString=toString;
    this.empty = empty;
}

添加元素

Enqueue,向队尾添加一个元素

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function enqueue(element)
{
    this. dataStore.push( element);
}

删除元素

dequeue,删除队首的元素

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function dequeue(){
    return this.dataStore. shift();
}

读取队首和队尾的元素

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function front()
{
    return this.dataStore[0];
}
function back()
{
    return this.dataStore[this.dataStore.length-1];
}

判断队列是否为空

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function empty(){
    if (this.dataStore.length==0)
    {
        return true;
    }
    else
    {
        return false;
    }
}

完整的Queue类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function Queue()
{
    this.dataStore=[];
    this.enqueue=enqueue;
    this.dequeue=dequeue;
    this.front=front;
    this.back=back;
    this.toString=toString;
    this.empty = empty;
}
function enqueue(element)
{
    this. dataStore.push(element);
}
function dequeue(){
    return this.dataStore. shift();
}
function front()
{
    return this.dataStore[0];
}
function back()
{
    return this.dataStore[this.dataStore.length-1];
}
function toString() {
    var retStr = "";
    for (var i = 0; i < this. dataStore. length; ++ i) {
        retStr += this. dataStore[ i] + "\n"; }
    return retStr;
}
function empty(){
    if (this.dataStore.length==0)
    {
        return true;
    }
    else
    {
        return false;
    }
}

小节

今天小编和大家一起探索了两种线性数据结构:堆栈和队列。堆栈按顺序存储数据并删除最近添加的数据;队列按顺序存储数据,但删除最早添加的数据。堆栈与队列我们会经常遇到,如果需要按顺序组织数据,请优先考虑使用堆栈和队列。

TypeScript High Performance》

关注本公众号,回复"原版英文电子书",进行下载

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
数据结构于JS也可以成为CP(四)队列
Hello小伙伴们,好久不见,栈说完了,我们就来说说队列吧~这是个和栈遥相呼应的数据结构呢。还记得栈的特点吗,栈只能在栈顶添加或删除。栈是一种后入先出的结构。而队列呢,则相反,只能队尾插入元素、队首删除元素,主要用于存储顺序的数据,先进先出。
萌兔IT
2019/07/26
3840
JS 算法与数据结构之队列
队列是一种先进先出(FIFO,First-in-first-out)的数据结构,其数据智能在队尾插入,在队首删除。
Leophen
2021/06/22
5370
JS高级-数据结构的封装
最近在看了《数据结构与算法JavaScript描述》这本书,对大学里学的数据结构做了一次复习(其实差不多忘干净了,哈哈)。如果能将这些知识捡起来,融入到实际工作当中,估计编码水平将是一次质的飞跃。带着这个美好的愿望,开始学习吧O(∩_∩)O~~ 我们知道在JS中,常常用来组织数据的无非是数组和对象(这些基础就不介绍了)。但在数据结构中,还有一些抽象的数据类型:列表、栈、队列、链表、字典、散列、集合、二叉树、图等,可以用来更好的对实际场景建模。当然这些数据类型,原生JS不支持,那么就需要通过封装来模拟,其底层
小古哥
2018/03/08
8.1K0
「数据结构与算法Javascript描述」队列
队列是一种列表,不同的是队列只能在队尾插入元素,在队首删除元素。队列用于存储按顺序排列的数据,「先进先出」,这点和栈不一样,在栈中,最后入栈的元素反而被优先处理。可以将队列想象成在银行前排队的人群,排在最前面的人第一个办理业务,新来的人只能在后面排队,直到轮到他们为止。
用户8921923
2022/10/24
4190
「数据结构与算法Javascript描述」队列
搞定数据结构-栈和队列
如下,使用栈结构操作. “网”这个错别字在栈顶,“网”改成”望”只需要将“网”从栈顶移除重新写入”望”.
用户3045442
2019/11/06
5530
搞定数据结构-栈和队列
重生之“我打数据结构,真的假的?”--3.栈和队列(无习题)
在C语言中,**栈(Stack)和队列(Queue)**是两种非常重要的数据结构。它们广泛用于各种应用中,比如内存管理、任务调度、表达式求值等。本文将对这两种数据结构进行详细的介绍,并展示如何在C语言中实现它们。
hope kc
2024/11/21
770
重生之“我打数据结构,真的假的?”--3.栈和队列(无习题)
【算法与数据结构】--常见数据结构--栈和队列
栈(Stack) 是一种基本的数据结构,具有后进先出(LIFO)的特性,类似于现实生活中的一叠盘子。栈用于存储一组元素,但只允许在栈顶进行插入(入栈)和删除(出栈)操作。以下是栈的关键特性和操作:
喵叔
2023/10/17
2730
数据结构与算法(2)——栈和队列栈队列LeetCode 相关题目整理其他题目整理
栈是一种用于存储数据的简单数据结构(与链表类似)。数据入栈的次序是栈的关键。可以把一桶桶装的薯片看作是一个栈的例子,当薯片做好之后,它们会依次被添加到桶里,每一片都会是当前的最上面一片,而每次我们取的时候也是取的最上面的那一片,规定你不能破坏桶也不能把底部捅穿,所以第一个放入桶的薯片只能最后一个从桶里取出;
我没有三颗心脏
2018/07/24
1.3K0
JS 算法与数据结构之栈
列表是一种最自然的数据组织方式,如果数据存储的顺序不重要,且无需对数据进行查找,那么列表是一种再好不过的数据结构,但对于其它一些应用,列表就显得太过简陋,我们需要一种更复杂的数据结构——栈
Leophen
2021/06/17
8560
「数据结构与算法Javascript描述」栈
栈是一种特殊的列表,栈内的元素只能通过列表的一端访问,这一端称为栈顶。咖啡厅内的一摞盘子是现实世界中常见的栈的例子。只能从最上面取盘子,盘子洗净后,也只能摞在这一摞盘子的最上面。栈被称为一种后入先出(LIFO,last-in-fifirst-out)的数据结构。
用户8921923
2022/10/24
4360
「数据结构与算法Javascript描述」栈
数据结构于JS也可以成为CP(三)栈
Hello小伙伴们大家好,今天要为大家带来的是栈,这是数据结构中常用到的一种结构。它和列表有一点相似,又有些不同。相对于列表来说,栈更加高效,为啥呢,因为栈只能在栈顶添加或删除。栈是一种后入先出的结构。
萌兔IT
2019/07/26
4440
【数据结构】队列的顺序表实现&&收尾栈和队列
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
每天都要进步呀
2023/03/28
5430
【数据结构】队列的顺序表实现&&收尾栈和队列
数据结构基础-栈和队列
栈是一个有序线性表,只能在表的一端(成为栈顶,top)执行插入和删除操作。最后插入的元素将第一个被删除。所以栈也称为后进先出(Last In First Out)或先进后出(First In Last Out)线性表。栈主要有两个操作,一个入栈(push),表示在栈中插入一个元素,一个出栈(pop),表示将栈顶元素删除。试图对空栈执行出栈操作称为UnderFlow,对满栈执行入栈操作称为OverFlow。
1025645
2019/03/05
4870
数据结构与算法(五) 队列
•先进先出原则(First In First Out) FIFO•队尾(rear):只能进行入队操作(enQueue)->添加元素•队头(front):只能进行出队(deQueue) ->取出元素•一般底层由双链表来实现
老沙
2019/10/11
4690
数据结构与算法(五) 队列
数据结构-栈和队列
栈是一种特殊的线性表。其特殊性在于限定插入和删除数据元素的操作只能在线性表的一端进行。如下所示:
黄规速
2022/04/14
5650
数据结构-栈和队列
期末复习之数据结构 第3章 栈和队列
五:写出下列程序段的输出结果(栈的元素类型SElem Type为char)。 1.void main( ){ Stack S; Char x,y; InitStack(S); X=’c’;y=’k’; Push(S,x); Push(S,’a’); Push(S,y); Pop(S,x); Push(S,’t’); Push(S,x); Pop(S,x); Push(S,’s’); while(!StackEmpty(S)){ Pop(S,y);printf(y); }; Printf(x); } 答:输出为“stack”。 2.【严题集3.12②】写出下列程序段的输出结果(队列中的元素类型QElem Type为char)。 void main( ){ Queue Q; Init Queue (Q); Char x=’e’; y=’c’; EnQueue (Q,’h’); EnQueue (Q,’r’); EnQueue (Q, y); DeQueue (Q,x); EnQueue (Q,x); DeQueue (Q,x); EnQueue (Q,’a’); while(!QueueEmpty(Q)){ DeQueue (Q,y);printf(y); }; Printf(x); } 答:输出为“char”。 3.【严题集3.13②】简述以下算法的功能(栈和队列的元素类型均为int)。 void algo3(Queue &Q){ Stack S; int d; InitStack(S); while(!QueueEmpty(Q)){ DeQueue (Q,d); Push(S,d); }; while(!StackEmpty(S)){ Pop(S,d); EnQueue (Q,d); } } 答:该算法的功能是:利用堆栈做辅助,将队列中的数据元素进行逆置。
henu_Newxc03
2021/12/28
7690
期末复习之数据结构 第3章 栈和队列
如何使用Java实现栈和队列的操作?
使用Java实现栈(Stack)和队列(Queue)的操作是很常见的任务。栈和队列是两种不同的数据结构,它们分别具有特定的操作和行为。下面将详细介绍如何使用Java实现栈和队列的基本操作。
用户1289394
2024/05/29
3240
如何使用Java实现栈和队列的操作?
【地铁上的面试题】--基础部分--数据结构与算法--栈和队列
栈是一种基于后进先出(Last-In-First-Out,LIFO)原则的抽象数据类型(ADT)。它可以理解为一种特殊的线性数据结构,其中元素按照一定的顺序进行插入和删除操作。 栈的定义包括以下几个要点:
喵叔
2023/06/04
4340
JS数据结构与算法 — 栈与队列
栈与队列分别是两种数据结构,不同语言对于栈和队列有着不同的声明 栈数据结构的特点是 FILO(first in last out) 即先进后出,队列则是 FIFO(first in first out)即先进先出。 1. 数据结构【栈】介绍
用户9914333
2022/07/21
5120
JS数据结构与算法 — 栈与队列
数据结构 第三章栈和队列
假设在周末舞会上,男士和女士们分别进入舞厅,各自排成一队。跳舞开始,依次从男队和女队队头各出一人配成舞伴,若两队初始人数不同,则较长那一队未配对者等待下一轮舞曲。现要求写一算法模拟上述舞伴配对问题。 你需要用队列操作实现上述算法。请完成下面5个函数的操作。
十二惊惶
2024/02/28
3480
推荐阅读
相关推荐
数据结构于JS也可以成为CP(四)队列
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验