首页
学习
活动
专区
圈层
工具
发布

数据结构基础面试题-2023面试题库

存储结构:在这种类型中,数据存储在主存储器(即RAM)中,一旦使用此数据的功能完全执行,就会被删除。 不同之处在于存储结构将数据存储在计算机系统的内存中,而文件结构将数据存储在辅助存储器中。 6....堆栈有哪些应用? 堆栈是一种数据结构,用于表示应用程序在特定时间点的状态。堆栈由一系列项目组成,这些项目被添加到堆栈的顶部,然后从顶部删除。它是一种线性数据结构,遵循执行操作的特定顺序。...堆栈数据结构中提供的一些主要操作是: push:这会将项目添加到堆栈的顶部。如果堆栈已满,则会发生溢出情况。 pop:这将删除堆栈的顶部项目。如果堆栈为空,则会出现下溢情况。...在单链表中,每个项目都存储在单独的节点中。节点可以是单个对象,也可以是对象的集合。将项目添加到列表时,将更新节点并将新项目添加到列表末尾。...java.util.HashMap 在最坏的情况下,所有键可能具有相同的哈希代码,这将导致哈希表变成链表。在这种情况下,由于链表的性质,搜索值将花费 O(n) 的复杂性,而不是 O(1) 时间。

51100

【数据结构】线性表(七)堆栈:链式栈及其基本操作(初始化、判空、入栈、出栈、存取栈顶元素、清空栈);顺序栈与链式栈之比较

根据上述定义,每次删除(退栈)的总是最后插入(进栈)的元素。   如图所示的堆栈中,诸元素以a1,a2,a3,a4,a5的顺序进栈,而退栈的次序则是a5,a4,a3,a2,a1。...用单链表来实现栈可避免这个问题,其代价是要为每个栈元素分配一个额外的指针空间(存放指针域)。   用单链表实现堆栈,首先要考虑栈顶对应链表的表头还是表尾。...因为堆栈主要操作(插入、删除、存取)的对象是栈顶元素,若栈顶对应表尾,则每次栈顶操作都要对单链表进行遍历,其时间复杂性为O(n)(设链表的长度为n);若栈顶对应表头,则每个操作的时间复杂性是O(1),显然...创建一个新的节点 newNode: 将传入的值 value 赋给 newNode 的 data 成员; 将 newNode 的 next 指针指向当前堆栈的顶部节点; 更新堆栈的 top 指针为...接下来,通过连续调用 push 函数,将值 10、20 和 30 压入堆栈。 使用 peek 函数查看堆栈的顶部元素。 使用 pop 函数两次弹出堆栈的元素。

1.5K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    攻击本地主机漏洞(中)

    堆栈是一种数据结构,有两个简单的操作,push和pop,它们遵循后进先出(LIFO)行为模型。推送操作将数据存储在堆栈顶部,pop从堆栈顶部检索数据。...基于堆栈的缓冲区溢出类似于前面的堆示例,因此,当程序向缓冲区写入的数据超过堆栈分配的处理量时,可能会导致覆盖现有堆栈数据,并在覆盖指令指针时导致拒绝服务或任意代码执行。...子例程是较大程序的一部分,包括一组执行任务的指令。可以使用库函数,而不是将恶意负载写入堆栈,恶意程序可以使用其条目位置覆盖返回地址。...为了插入恶意负载并执行shell,而不是一堆a,我们需要知道在500字节的负载中,它在哪里覆盖RBP以导致跳转。...表10-6提供了在RBP位置找到的每个地址的十六进制到ASCII的转换。

    2.1K20

    【译】JavaScript的工作原理:引擎,运行时和调用堆栈的概述

    如果我们运行函数,将把它放在堆栈的顶部。如果我们从函数返回,我们会从堆栈的顶部弹出来。 这就是所有堆栈都可以做到的。 我们来看一个例子吧。看一下下面的代码: ?...当这个引擎开始执行这个代码的时候,堆栈目前是空的,之后,步骤如下: ? 调用堆栈中的每个条目称为堆栈帧。 这儿是抛出异常时堆栈跟踪的构造方式 - 它基本上是异常发生时调用堆栈的状态。...“爆栈”——当达到最大调用堆栈大小时会发生这种情况,这很容易发生,特别是如果你使用递归而没有测试你的代码。 看看这个示例代码: ?...当引擎开始执行这份代码的时候,它将开始调用“foo”函数,然而这个函数是一个调用自身并且没有任何终止条件的递归函数,因此,每一步执行,相同的函数会一遍又一遍被添加到调用堆栈,如下图: ?...在某种程度上,函数调用在调用堆栈的数量超过实际的调用堆栈的大小,浏览器会决定采取行动,通过抛出一个错误,如下: ?

    1.4K30

    JavaScript是如何工作的?

    内存堆 JavaScript 引擎有时无法在编译时分配内存,因此在运行时分配的变量将进入内存堆(内存的非结构化区域)。即使我们退出在堆中分配内存的函数,我们在堆部分中分配的数据/对象仍然存在。...执行上下文栈 堆栈是遵循后进先出(LIFO)原理的数据结构(进入堆栈的最后一项将是要从堆栈中删除的第一项)。 ECS 存储所有功能的执行上下文。执行上下文定义为存储局部变量,函数和对象的对象。...简而言之,每个功能都被推到袋子的顶部。JavaScript 引擎执行此堆栈顶部的功能 由于 JavaScript 引擎只有一个 ECS,因此一次只能执行一件事情,这是 ECS 的顶部。...这就是使 JavaScript 单线程的原因。 您一定听说过堆栈溢出。 这意味着什么?-ECS 的空间也有限。因此,如果我们继续在堆栈顶部添加功能。在某个时候,将没有更多的空间来添加更多的堆栈框架。...回调队列 回调队列或消息队列是遵循先进先出原则的队列数据结构(首先插入队列的项目将首先从队列中删除)。它存储所有从事件表移至事件队列的消息。每个消息都有一个关联的功能。

    4.1K31

    【愚公系列】2021年12月 Python教学课程 05-列表List

    嵌套列表) 9.列表的遍历 10.列表的内置方法 11.将列表当做堆栈 一、列表List 列表是 Python 中最基本也是最常用的数据结构之一。...从数据结构角度看,Python 的列表是一个可变长度的顺序存储结构,每一个位置存放 的都是对象的指针。...函数 作用 len(list) 返回列表元素个数,也就是获取列表长度 max(list) 返回列表元素最大值 min(list) 返回列表元素最小值 list(seq) 将序列转换为列表 7.切片 切片指的是对序列进行截取...11.将列表当做堆栈 Python 的列表特别适合也很方便作为一个堆栈来使用。堆栈是一种特定的数据结构, 最先进入的元素最后一个被释放(后进先出)。...将列表的表头作为栈底,表尾作为栈顶, 就形成了一个堆栈。用列表的 append()方法可以把一个元素添加到堆栈顶部(实际上 就是在列表的尾部添加一个元素)。

    76120

    JavaScript如何工作:引擎,运行时和调用堆栈的概述

    调用堆栈 JavaScript是单线程编程语言,这意味着它有一个单一的调用堆栈。 因此,它可以一次做一件事。 调用堆栈是一个数据结构,它基本上记录了我们在程序中什么位置。...如果我们进入一个函数,我们在堆栈的顶部。 如果我们从一个函数返回,我们从堆栈的顶部弹出。 这就是堆栈可以做的。 我们来看一个例子。...调用堆栈中的每个条目称为堆栈帧。 这正是抛出异常时构造堆栈跟踪的方式 - 当异常发生时,它基本上是调用堆栈的状态。...然而,这个函数是递归的,并且开始调用自身而没有任何终止条件。 所以在执行的每个步骤中,相同的功能被一次又一次地添加到调用堆栈中。 看起来像这样: ?...然而,在某些时候,调用堆栈中的函数调用次数超过了调用堆栈的实际大小,并且浏览器决定采取行动,通过抛出一个错误,看起来像这样: ?

    2.4K40

    「首席架构师看敏捷建模」敏捷核心实践:怎么样排列需求?

    因为需求经常变化,您需要一个精简的、灵活的方法来进行需求变更管理:简而言之,敏捷者努力真正地管理变更,而不是阻止变更。...有几个要点需要理解: 新需求由项目涉众确定优先级,并添加到堆栈的适当位置。 从根本上说,当涉及到需求优先级时,一个人需要成为最终的权威。...如果这些要求没有堆栈的顶部,他们常常因为风险和回报(值)倾向于使相互,然后他们用产品所有者讨论这个问题,看看他们能激励人(负责优先级)将这些需求转移到堆栈的顶部。...因为我们知道所有的需求,更不用说一般的工作项,都不是平等创建的,所以我们不应该天真地假设我们应该在迭代开始的时候等待从堆栈顶部取出迭代的工作值。...如果工作项确实被证明是需要的,那么它总是可以在将来的某个日期添加到池中。请注意,老化规则在不同的团队之间会有所不同,一个团队可能需要3个月,而另一个团队可能需要5个月。

    72510

    Swift算法俱乐部:Swift栈(Stack)数据结构

    最后推进的元素是即将被推出的第一个元素。 (非常类似的数据结构,队列是FIFO,或先进先出。) 开始了解堆栈 我们用下面这堆书来模拟堆栈的工作方式 ?...peek方法允许您检查堆栈顶部的内容。 ? pop:当你想删除堆栈中的元素时,你从堆栈中弹出一个元素。 你可能会认为它是从书堆中拿走顶部的书籍。 ?...注意,push操作会将新元素放在数组的末尾,而不是开始。 在数组的开头插入代价很昂贵,因为它需要所有现有的数组元素在内存中移位。 最后加上O(1); 无论数组大小如何,它总是需要相同的时间。...这需要是一个变量而不是一个常量,因为下面我们需要改变栈的内容。 在堆栈中PUSH了一个字符串。...之后用joined(separator: "\n")方法简单地使用数组中的每个元素,并在每个元素之间使用分隔符将它们连接在一起。

    2.3K20

    第二章 IBM-PC微机的基本功能

    2.每个存储单元存放相同长度的二进制数 一个存储单元的长度一般为8位二进制数,即一个字节。...在8086/8088的汇编语言源程序中,用户可以根据自己需要来设定段的个数、各个段长度和每个段的用途。并且代码或数据可以存放在段内任意单元中。...即最先送入堆栈的数据要到最后才能取出,而最后送入堆栈的数据,最先取出。 二、8086/8088堆栈的组织 在8086/8088微机中堆栈是由堆栈段寄存器SS指示的一段存储区。...数据在堆栈中的存放格式是:以字为单位存放,数据的低8位放在较低地址单元,高8位放在较高地址单元。 当用户程序中要求的堆栈长度超过一个堆栈段的最大长度64KB时,可以设置几个堆栈段。...2.进栈PUSH 进栈就是把数据存入堆栈。 由指令PUSH或者由机器自动实现,可以将通用寄存器、段寄存器或字存储单元的内容压入堆栈顶部。

    90320

    java集合框架容器 java框架层级 继承图结构 集合框架的抽象类 集合框架主要实现类

    不过,选取哪些数据结构,使用哪些算法,继承层级如何安排,这是java自己的特点; 回到顶部 集合框架的层级结构 当然,并不是说你用Java编写一个双向链表就是写出来集合框架了Java是面向对象的语言,...面向对象的三大基础特征,封装继承多态嘛想要给一门编程语言提供一个集合框架,自然不是写几个算法数据结构这么简单的事情Java中的集合框架是自顶而下设计的如同所有的对象的祖宗都是Object一样集合框架自然也是有祖宗的...方法add,remove和element分别基于offer,poll和peek,但是会抛出异常而不是通过false或null返回来指示失败。...同步的 (4)Stack ? Stack类表示后进先出(LIFO)对象堆栈。 它使用五个操作来扩展类Vector,这样子可以将一个Vector视为一个堆栈。...提供了: 通常的推送和弹出操作, 以及一种方法来查看堆栈中的顶层项目, 一种方法来测试堆栈是否为空, 以及一种方法来搜索堆栈中的项目并发现它有多远是从顶部。 当第一次创建堆栈时,它不包含任何元素。

    1.4K20

    《Java 数据结构与算法》第4章:栈

    二、堆栈数据结构 在计算机科学中,堆栈是一种抽象数据类型,用作元素的集合,具有两个主要的操作; PUSH:将元素添加到集合 POP:删除最近添加但尚未删除的元素 堆栈是一种 LIFO(后进先出)的线性的数据结构...这种结构可以很容易地从堆栈顶部取出一个项目,而要到达堆栈更深处的一个项目可能需要先取出多个其他项目。例如;我们经常看到的浏览器访问记录,总是把最近记录展示给你。...当数组长度超过初始空间后,进行2的n次幂左移一位扩容,并将数组内容的元素按照分半分别进行迁移。...氛围弹出队列中未发生迁移的数据,和已经完全迁移好的数据。凡是迁移的数据,都是保证了一个顺序。 综上你可能还不是很理解这个数据结构的精妙设计和使用,接下来小傅哥再带着你从代码实现的角度来看下。 2....为什么不是用 Stack 类? ArrayDeque 是基于什么实现的? ArrayDeque 数据结构使用过程叙述。 ArrayDeque 为什么要初始化2的n次幂个长度?

    68620

    学习算法必须要了解的数据结构

    常用的数据结构 常用的数据结构包括数组、堆栈、队列、链表、树、图表和哈希表等等,下面我们就简要介绍一下: 数组 数组是最简单和最广泛使用的数据结构。其他数据结构(如堆栈和队列)都是从数组派生的。...下例是一个大小为4的简单数组: ? 每个数据元素都会分配一个称为索引值,该值对应于该项目在数组中的位置。大多数语言将数组的起始索引定义为0。...堆栈的基本操作: Push - 在顶部插入元素 Pop - 从堆栈中删除后返回顶部元素 isEmpty - 如果堆栈为空,则返回true Top - 返回顶部元素而不从堆栈中删除 常见的Stack面试问题...如果再来一个人,那么他将从最后加入队列,而不是从头开始 - 站在前面的人将是第一个获得票离开。 下图是一个包含四个数据元素(1,2,3和4)的队列: ?...因此,该对象以“键值”对的形式存储,并且这些项的集合被称为“字典”。可以使用该键搜索每个对象。基于哈希有不同的数据结构,但最常用的数据结构是哈希表。哈希表通常使用数组实现。

    2.7K20

    C#堆栈和队列

    堆栈中的数据只能在表的某一端进行添加和删除操作, 反之队列中的数据则在表的一端进行添加操作而在表的另一端进行删除操作. 堆栈被广泛用于从表达式计算到处理方法调用的任何编程语言的实现中....可访问的这端被称为是栈顶. 堆栈的标准模型是自助餐厅的盘子堆. 人们始终要从顶部拿走盘子, 而且当洗碗工或者杂工把盘子放回盘子堆的时候也是把它放在盘堆的顶部....Pop 操作会返回栈顶的数据项, 但是此操作也会把此数据项从堆栈中移除. 如果只是希望察看栈顶的数据项而不是真的要移除它, 那么在C#中有一种名为Peek(取数)的操作可以实现....入栈方法Push将调用ArrayLsit的Add 方法, 并且把传递给它的数值添加到ArrayList里面....(); Console.WriteLine(); Console.WriteLine("使用ToArray方法, 将长度为10的堆栈转换为数组, 赋值给长度为15的数组, 结果如下 :"

    1.7K30

    与机器学习算法相关的数据结构

    一旦数组的大小超过存储空间,就会分配一个大小为两倍的新空间,将值复制到其中,并删除旧数组。...这是一个O(n)操作,其中n是数组的大小,但由于它只是偶尔发生,所以将一个新值添加到末尾的时间实际上会被分解为常数时间O(1)。它是一个非常灵活的数据结构,具有快速平均插入和快速访问。...之后,它们可以转换为固定长度的数组以便快速访问。因此,我使用链接列表类,其中包含转换为数组的方法。 二叉树 二叉树类似于链表,只不过每个节点有两个指向后续节点的指针,而不是只有一个节点。...通常,顶部的最高排序值是从堆中提取的,以便对列表进行排序。与树不同,大多数堆只是存储在数组中,元素之间的关系仅是隐式的。 堆叠 堆栈被定义为“先进后出”,一个元素被推到堆栈顶部,覆盖前一个元素。...更复杂的数据结构也可以由基本结构组成。考虑一个稀疏矩阵类。在稀疏矩阵中,大多数元素为零,并且仅存储非零元素。我们可以将每个元素的位置和值存储为三元组,并在可扩展数组中包含它们的列表。

    3K30

    JavaScript的工作原理:引擎,运行时和调用堆栈的概述

    调用栈(Call Stack)是一种数据结构,它主要是记录 JavaScript 整个执行过程。如果我们执行一个函数,我们将把它放在栈的顶部(压栈);如果函数返回,会弹出堆栈的顶部(出栈)。...调用栈中的每个条目称为堆栈帧(Stack Frame)。 这正是抛出异常时堆栈跟踪的构造方式 - 它基本上是异常发生时调用栈的状态(异常后的全过程)。...“堆栈溢出(Blowing the stack)” — 当达到最大调用堆栈大小时会发生这种情况(Javascript引擎产生的堆栈超过 Javascript 运行环境所提供的最大数量)。...但是,此函数是递归的,并且在没有任何终止条件的情况下开始调用自身(产生无限循环)。因此,在执行的每个步骤中,相同的函数会一遍又一遍地添加到调用堆栈中。它看起来像这样: ?...然而,在某些时候,调用堆栈中的函数调用数量超过了调用堆栈的实际大小,浏览器会抛出看起来像这样的错误: ?

    1.9K31

    这些题都不会,面试你怎么可能过?

    常用的数据结构 我们首先列出最常用的数据结构,然后再挨个讲解: 数组 堆栈 队列 链表 树 图 字典树 哈希表 数组 数组是一种最简单和最广泛使用的数据结构,其它数据结构比如堆栈和队列都源自数组。...有没有想过它是如何工作的?其思路就是,按照最后的状态排列在先的顺序将工作的先前状态(限于特定数字)存储在内存中。这只用数组是无法实现的,因此堆栈就有了用武之地。 可以把堆栈看作一堆垂直排列的书籍。...堆栈的基本操作: Push——在顶部插入元素 Pop—— 从堆栈中删除后返回顶部元素 isEmpty——如果堆栈为空,则返回 true Top ——返回顶部元素,但不从堆栈中删除 常见的堆栈面试问题:...如果有新人来,他们是从末尾加入队列,而不是在开头——站在前面的人将先买到票然后离开队列。 下图是一个包含四个数据元素(1,2,3 和 4)的队列,其中 1 位于顶部,首先把它删除: ?...因此,对象以“键值”对的形式存储,这些项的集合被称为“字典”。可以使用该键值搜索每个对象。有多种不同的基于哈希的数据结构,但最常用的数据结构是哈希表。 哈希表通常使用数组实现。

    1.4K20

    JVM内存模型

    在本文中,我将重点关注JVM 规范中描述的运行时数据区。这些区域旨在存储程序或 JVM 本身使用的数据。我将首先介绍 JVM 的概述,然后介绍字节码是什么,最后介绍不同的数据区域。...注意:如果经常使用,许多 JVM 实现的执行引擎会将字节码编译为本机代码,而不是总是解释字节码。它被称为即时 ( JIT ) 编译,大大加快了 JVM。...还有其他处理基本操作的方法,例如基于寄存器的体系结构将操作数存储在小寄存器中而不是堆栈中。桌面/服务器 (x86) 处理器和以前的 android 虚拟机 Dalvik 使用这种基于寄存器的架构。...如果超过此限制,JVM 将抛出OutOfMemoryError。 运行时常量池 该池是方法区的子部分。由于它是元数据的重要组成部分,Oracle 规范将运行时常量池与方法区分开描述。...每个加载的类/接口都会增加这个常量池。这个池就像传统编程语言的符号表。换句话说,当一个类、方法或字段被引用时,JVM 通过运行时常量池在内存中搜索实际地址。它还包含常量值,如字符串文字或常量原语。

    1.2K40

    【Java】基础25:List、Set以及哈希表

    那么问题来了,数组长度不可变,ArrayList怎么又可变了呢? ArrayList默认是长度为10的数组,如果超过了,就会扩容。 如何扩容创建一个新的数组,再将旧数组复制进去,这样长度就增加了。...链表增删快,故LinkedList常用来增删数据。 集合中重要的是增删改查四种方法,linkedList有几种特殊的方法: ①addFirst方法:将元素添加到开头。...②addLast方法:将元素添加到结尾。 ③removeFirst方法:将开头元素移除并返回。 其中pop方法和removeFirst方法一样。 ④removeLast方法:将结尾元素移除并返回。...其中有两个方法比较特殊,官方解释如下: pop方法:从此列表所表示的堆栈处弹出一个元素。 push方法:将元素推入此列表所表示的堆栈。 不要看它解释的这么复杂,其实就是堆栈结构,堆栈有什么特点?...数组有一个问题,就是长度是一定的,所以若是元素过多时,需要扩容。但是哈希表数据结构比较复杂,还要提前扩容:哈希表中数组默认长度16,如果数组中的元素超过了75%就开始扩容。

    1K10
    领券