首页 > 其他分享 >说说你对栈、队列的理解?应用场景?

说说你对栈、队列的理解?应用场景?

时间:2024-04-11 18:44:20浏览次数:26  
标签:场景 return 队列 items 元素 栈顶 理解 rear

一、栈

栈(stack)又名堆栈,它是一种运算受限的线性表,限定仅在表尾进行插入和删除操作的线性表

表尾这一端被称为栈顶,相反地另一端被称为栈底,向栈顶插入元素被称为进栈、入栈、压栈,从栈顶删除元素又称作出栈

所以其按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据,具有记忆作用

关于栈的简单实现,如下:

class Stack {
  constructor() {
    this.items = [];
  }

  /**
   * 添加一个(或几个)新元素到栈顶
   * @param {*} element 新元素
   */
  push(element) {
    this.items.push(element)
  }

  /**
   * 移除栈顶的元素,同时返回被移除的元素
   */
  pop() {
    return this.items.pop()
  }

  /**
   * 返回栈顶的元素,不对栈做任何修改(这个方法不会移除栈顶的元素,仅仅返回它)
   */
  peek() {
    return this.items[this.items.length - 1]
  }

  /**
   * 如果栈里没有任何元素就返回true,否则返回false
   */
  isEmpty() {
    return this.items.length === 0
  }

  /**
   * 移除栈里的所有元素
   */
  clear() {
    this.items = []
  }

  /**
   * 返回栈里的元素个数。这个方法和数组的length属性很类似
   */
  size() {
    return this.items.length
  }
}

关于栈的操作主要的方法如下:

  • push:入栈操作
  • pop:出栈操作

二、队列

跟栈十分相似,队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作

进行插入操作的端称为队尾,进行删除操作的端称为队头,当队列中没有元素时,称为空队列

在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出

简单实现一个队列的方式,如下:

class Queue {
    constructor() {
        this.list = []
        this.frontIndex = 0
        this.tailIndex = 0
    }
    enqueue(item) {
        this.list[this.tailIndex++] = item
    }
    unqueue() {
        const item  = this.list[this.frontIndex]
        this.frontIndex++        
        return item
    }
}

上述这种入队和出队操作中,头尾指针只增加不减小,致使被删元素的空间永远无法重新利用

当队列中实际的元素个数远远小于向量空间的规模时,也可能由于尾指针已超越向量空间的上界而不能做入队操作,出该现象称为"假溢"

在实际使用队列时,为了使队列空间能重复使用,往往对队列的使用方法稍加改进:

无论插入或删除,一旦rear指针增1或front指针增1 时超出了所分配的队列空间,就让它指向这片连续空间的起始位置,这种队列也就是循环队列

下面实现一个循环队列,如下:

class Queue {
    constructor(size) {
        this.size = size; // 长度需要限制, 来达到空间的利用, 代表空间的长度
        this.list = [];
        this.font = 0; // 指向首元素
        this.rear = 0;  // 指向准备插入元素的位置
    }
    enQueue() {
        if (this.isFull() == true) {
            return false
        }
        this.rear = this.rear % this.k;
        this._data[this.rear++] = value;
        return true
    }
    deQueue() {
        if(this.isEmpty()){
            return false;
        }
        this.font++;
        this.font = this.font % this.k;
        return true;
    }
    isEmpty() {
        return this.font == this.rear - 1;
    }
    isFull() {
        return this.rear % this.k == this.font;
    }
}

上述通过求余的形式代表首尾指针增1 时超出了所分配的队列空间

三、应用场景

借助栈的先进后出的特性,可以简单实现一个逆序数处的功能,首先把所有元素依次入栈,然后把所有元素出栈并输出

包括编译器的在对输入的语法进行分析的时候,例如"()""{}""[]"这些成对出现的符号,借助栈的特性,凡是遇到括号的前半部分,即把这个元素入栈,凡是遇到括号的后半部分就比对栈顶元素是否该元素相匹配,如果匹配,则前半部分出栈,否则就是匹配出错

包括函数调用和递归的时候,每调用一个函数,底层都会进行入栈操作,出栈则返回函数的返回值

生活中的例子,可以把乒乓球盒比喻成一个堆栈,球一个一个放进去(入栈),最先放进去的要等其后面的全部拿出来后才能出来(出栈),这种就是典型的先进后出模型

队列

当我们需要按照一定的顺序来处理数据,而该数据的数据量在不断地变化的时候,则需要队列来帮助解题

队列的使用广泛应用在广度优先搜索种,例如层次遍历一个二叉树的节点值(后续将到)

生活中的例子,排队买票,排在队头的永远先处理,后面的必须等到前面的全部处理完毕再进行处理,这也是典型的先进先出模型

参考文献

  • https://baike.baidu.com/item/%E6%A0%88/12808149
  • https://baike.baidu.com/item/%E9%98%9F%E5%88%97/14580481

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

 

标签:场景,return,队列,items,元素,栈顶,理解,rear
From: https://www.cnblogs.com/smileZAZ/p/18129859

相关文章

  • 2024年腾讯云8核16G服务器性能评测:高并发场景下的表现如何?
    在当今的云计算时代,服务器的配置与性能直接关系到应用程序的稳定运行和用户体验。腾讯云作为国内领先的云服务提供商,其8核16G18M配置的云服务器备受关注。那么,这款服务器究竟能支撑多少人的并发量呢?首先,我们要明确一个概念:并发量不仅取决于服务器的硬件配置,还与应用程序的类型......
  • 队列的基本操作
    (一)结构体定义一个顺序队列typedefstruct{chardata[maxsize];intrear,front; }sqQueue;(二)队列的初始化头尾两个指针指向0voidInitQueue(sqQueue*s){ (*s).rear=(*s).front=0;}(三)进队操作 注意循环队列的使用intEnQueue(sqQueue*Q,charx)//入队{ ......
  • 【C++】深入理解 C++ 中的 auto 关键字
    深入理解C++中的auto关键字1.概念2.用法2.1基本用法2.2结合复杂类型2.3函数返回类型推导2.4使用auto处理复杂类型3.注意事项4.适用场景在C++11标准中引入了auto关键字,它是一项强大的特性,可以大大简化代码的书写,同时提高代码的可读性和灵活性。......
  • 数据结构之队列(java语言版)
    队列(Queue):在逻辑上是一种线性存储结构。它有以下几个特点:1、队列中数据是按照"先进先出(FIFO,First-In-First-Out)"方式进出队列的。2、队列只允许在"队首"进行删除操作,而在"队尾"进行插入操作。队列通常包括的两种操作:入队列和出队列。队列的种类也很多,单向队列,双向队列,循......
  • 数据结构之队列(c语言版)
    队列(Queue):在逻辑上是一种线性存储结构。它有以下几个特点:1、队列中数据是按照"先进先出(FIFO,First-In-First-Out)"方式进出队列的。2、队列只允许在"队首"进行删除操作,而在"队尾"进行插入操作。队列通常包括的两种操作:入队列和出队列。队列的种类也很多,单向队列,双向队列,循......
  • openGauss监控场景处理
    openGauss监控场景处理死锁数量异常判断方法:selectsum(deadlocks)asdeadlocksfromdbe_perf.GLOBAL_STAT_DATABASE异常分析:请求与保持条件:获取资源的进程可以同时申请新的资源。非剥夺条件:已经分配的资源不能从该进程剥夺。循环等待条件:多个进程构成环路,并且每个进程......
  • 手把手教你做阅读理解题-初中中考阅读理解解题技巧016-introduce the effect of music
    PDF格式公众号回复关键字:ZKYD016阅读理解技巧,在帮助读者有效获取和理解文本信息方面发挥着重要作用,熟练掌握如下6个技巧,可快速突破阅读理解1预览文章结构在开始深入阅读之前,快速浏览文章的标题、段落开头和结尾,可以迅速把握文章的主题、大致内容和结构标题通常能概括文章......
  • R数据分析:网状meta分析的理解与实操
    meta分析之前有给大家写过,但是meta分析只能比较两个方法。经常是被用来证明在现有研究中显示矛盾结果的干预方法到底有没有效的时候使用,通过证据综合得到某种干预到底有没有用的结论。但是如果我要证明好几种方法到底哪个最优,这个时候meta分析就不行了,我们得使用网状meta。Thec......
  • Python中关于finally的使用场景
    finally关键字在Python中用于定义一个代码块,该代码块在try-except结构中无论是否发生异常,或者在try块中执行了return、break、continue等控制流语句,都会被执行。finally子句提供了确保某些清理操作(如释放资源、关闭文件、断开连接等)始终执行的一种机制,即使程序在处理过程中遭遇异......
  • 机器学习和深度学习--李宏毅(笔记与个人理解)Day9
    Day9LogisticRegression(内涵,熵和交叉熵的详解)中间打了一天的gta5,图书馆闭馆正好+npy不舒服那天+天气不好,哈哈哈哈哈总之各种理由吧,导致昨天没弄起来,今天补更!这里重点注意一下,这个output值是概率哈,也就是说式子整体表示的含义是x属于c1的概率是多大这个老师......