前往小程序,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
运行
复制
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
运行
复制
function push(element)
{
    this. dataStore[this.top++]=element;
}

定义pop方法

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

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

定义peek方法

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

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

定义length方法

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

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

定义clear方法

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

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

完整的Stack类

代码语言:javascript
代码运行次数:0
运行
复制
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
运行
复制
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
运行
复制
function enqueue(element)
{
    this. dataStore.push( element);
}

删除元素

dequeue,删除队首的元素

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

读取队首和队尾的元素

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

判断队列是否为空

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

完整的Queue类

代码语言:javascript
代码运行次数:0
运行
复制
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 删除。

评论
登录后参与评论
暂无评论
推荐阅读
05-选择排序
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
xbhog
2019/10/22
4100
05-选择排序
排序算法总结(多图)
不稳定的排序: 稳定性一个形象的比喻,本来有两个并列第三,一排序把原来并列的顺序给变了。 比如:选择排序、快速排序、堆排序、希尔排序; 参考链接
芋道源码
2018/10/26
6880
排序五 简单选择排序
该文介绍了冒泡排序算法的基本原理和实现过程,并通过示例代码和运行结果来展示冒泡排序算法的运行过程。同时,文章还对冒泡排序算法的时间复杂度和空间复杂度进行了分析。
静默虚空
2018/01/05
6430
排序五 简单选择排序
Python3选择排序
选择排序 概述 选择排序(Selection sort)是一种简单直观的排序算法。 它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 基本过程 n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果: 在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。 以此类推,直到所有元素均排序完毕。 代码 # -*- coding:utf-8 -*-
苦叶子
2018/04/09
6630
选择排序—简单选择排序(Simple Selection Sort)
在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换;然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止。
瑾诺学长
2018/09/21
1.9K0
选择排序—简单选择排序(Simple Selection Sort)
手敲一遍排序算法 Java
**稳 定:**插冒归计基(简单插入排序、冒泡排序、归并排序、计数排序、基数排序)
小锋学长生活大爆炸
2020/12/08
3560
数据结构算法--2 冒泡排序,选择排序,插入排序
思想就是将相邻元素两两比较,当一个元素大于右侧相邻元素时,交换他们的位置,小于右侧元素时,位置不变,最终序列中的最大元素,像气泡一样,到了最右侧。
@小森
2024/03/15
1080
数据结构算法--2 冒泡排序,选择排序,插入排序
算法渣-排序-选择排序
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。
码农戏码
2021/03/23
8540
选择排序
简单选择排序不能再简单了,基本思想就是先外层循环n,作用是每循环一遍找出一个数最小的(分为无序区和有序区),在无序区中找到最小的那个数,再给到有序区。当然,找到无序区中最小的数那样也需要在无序区中在循环遍历一遍,这样时间复杂度就是o(n2),是稳定排序。 下面贴出教材的简单选择排序代码
废江_小江
2022/09/05
1350
选择排序
选择排序
选择排序 思想 将数据分成两个部分:前面排好序和后面待排序的 从没有排序的数据选择出一个最小的数据,放在前面排好序的后面 不稳定 时间复杂度 最坏时间复杂度:O(n^2) 最优时间复杂度:O(n^2) Python实现 def select_sort(alist): # 选择排序 n = len(alist) for j in range(0, n-1): # 记录最小位置 min_index = j # 内层for循环找到了后
皮大大
2021/03/02
3080
C语言排序(冒泡排序、选择排序、插入排序和快速排序)
在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。每一趟排序后的效果都是讲没有沉下去的元素给沉下去。
全栈程序员站长
2022/09/12
1.7K0
C语言排序(冒泡排序、选择排序、插入排序和快速排序)
js 实现选择排序及优化
参考链接 :https://blog.csdn.net/hcz666/article/details/126486057
蓓蕾心晴
2022/09/24
4.8K0
十大排序算法详解(一)冒泡排序、选择排序、插入排序、快速排序、希尔排序[通俗易懂]
  冒泡排序是比较基础的排序算法之一,其思想是相邻的元素两两比较,较大的数下沉,较小的数冒起来,这样一趟比较下来,最大(小)值就会排列在一端。整个过程如同气泡冒起,因此被称作冒泡排序。   冒泡排序的步骤是比较固定的:
全栈程序员站长
2022/09/14
8250
十大排序算法详解(一)冒泡排序、选择排序、插入排序、快速排序、希尔排序[通俗易懂]
Java中数组高级之各种排序代码
1.冒泡排序 1 package cn.itcast; 2 3 /* 4 * 冒泡排序基本思路是: 5 * 依次比较相邻的两个数,将小数放在前面,大数放在后面。 6 * 即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。 7 * 然后比较第2个数和第3个数,将小数放前,大数放后,如此继续, 8 * 直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。 9 * 在
黑泽君
2018/10/12
5900
排序算法 (十) ---简单选择排序
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
葆宁
2022/01/13
3600
排序算法 (十) ---简单选择排序
【排序】插入排序与选择排序详解
选择排序是一种简单直观的排序算法。它的工作原理如下:在未排序序列中找到最小(大)元素,交换到起始位置,该元素为已排序序列的起始元素,继续在剩余未排序元素中找到最小(大)元素,交换到未排序序列起始位置,重复第二步,直到所有元素均排序完毕。
学习起来吧
2024/03/23
1750
【排序】插入排序与选择排序详解
选择排序
比如,第一次排序,所有元素(n)都是未排序的,就在所有元素里选出最小值,然后将这个最小值和第一个位置互换,然后第二次在剩余的元素(n-1)里先选出最小值(也就是全部元素(n)的第二小值),然后把最小值和第而个值互换位置,......以此类推,知道找到第n-1个元素和n互换位置后,第n个位置不用比较了,因为他就是最大值。
hss
2022/02/25
3290
面试官爱问的10大经典排序算法,20+张图来搞定
冒泡排序是因为越小的元素会经由交换以升序或降序的方式慢慢浮到数列的顶端,就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名冒泡排序。
C语言与CPP编程
2021/05/18
5660
面试官爱问的10大经典排序算法,20+张图来搞定
选择排序(简单选择排序、堆排序)
选择排序的基本思想是:每一趟在待排序元素中选取关键字最小(或最大)的元素加入有序子序列。
跋扈洋
2021/09/03
6080
选择排序(简单选择排序、堆排序)
一文搞定选择排序算法
选择排序使用了双层for循环;如果看过我上一篇文章的话,可以很快的知道一些技巧,双层for循环的时间复杂度是: O(N2) O(N^{2}) O(N2)
手撕代码八百里
2020/07/28
3180
相关推荐
05-选择排序
更多 >
目录
    • 定义Stack类的构造函数
    • 定义PUSH方法
    • 定义pop方法
    • 定义peek方法
    • 定义length方法
    • 定义clear方法
    • 完整的Stack类
  • 队列
    • 定义Queue构造函数
    • 添加元素
    • 删除元素
    • 读取队首和队尾的元素
    • 判断队列是否为空
    • 完整的Queue类
  • 小节
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档