📜  常见数据结构面试问题套装1

📅  最后修改于: 2021-05-20 07:10:32             🧑  作者: Mango

什么是数据结构?
数据结构是一种组织数据的方式,以便可以有效地使用数据。不同种类的数据结构适用于不同种类的应用程序,而某些则高度专用于特定任务。例如,B树特别适合于数据库的实现,而编译器的实现通常使用哈希表来查找标识符。 (来源:Wiki页面)

什么是线性和非线性数据结构?

  • 线性:如果数据结构的元素形成序列或线性列表,则称其为线性。示例:数组。链接列表,堆栈和队列
  • 非线性:如果节点的遍历本质上是非线性的,则数据结构被认为是非线性的。示例:图和树。

在不同的数据结构上可以执行哪些操作?

  • 插入?在给定的数据项集合中添加一个新的数据项。
  • 删除?从给定的数据项集合中删除现有数据项。
  • 遍历?只需一次访问每个数据项,以便可以对其进行处理。
  • 正在搜寻?找出数据项的位置(如果它存在于给定的数据项集合中)。
  • 排序?以数字顺序排列数据项,即以升序或降序排列,如果是字母数字数据,则以字典顺序排列。

数组与链接列表有何不同?

  • 数组的大小是固定的,链接列表的大小是动态的。
  • 在元素数组中插入和删除新元素非常昂贵,而插入和删除都可以在“链接列表”中轻松完成。
  • 链接列表中不允许随机访问。
  • 链接列表的每个元素都需要额外的指针存储空间。
  • 阵列具有更好的缓存局部性,可以在性能上产生很大的不同。

什么是Stack?在哪里可以使用?
堆栈是一种线性数据结构,用于访问元素的顺序为LIFO(后进先出)或FILO(后进先出)。堆栈的基本操作是:推入,弹出,窥视

堆栈的应用:

  1. 使用堆栈的中缀到后缀转换
  2. 后缀表达的评估
  3. 使用堆栈反转字符串
  4. 在数组中实现两个堆栈
  5. 检查表达式中的括号是否平衡

什么是队列,它与堆栈有何不同以及如何实现?
队列是如下的顺序是开始步骤I N开始步骤øUT(FIFO)到存取元件的线性结构。以下是队列中的基本操作:入队,出队前,后
堆栈和队列之间的区别在于删除。在堆栈中,我们删除最近添加的项目;在队列中,我们删除了最近最少添加的项目。队列和堆栈都可以使用数组和链接列表来实现。

什么是中缀,前缀,后缀表示法?

  • 前缀表示法: X + Y –运算符写在其操作数之间。这是我们编写表达式的常用方式。诸如
A * ( B + C ) / D

  • 后缀表示法(也称为“反向波兰语表示法”): XY +运算符写在其操作数之后。上面给出的中缀表达式等效于
A B C + * D/

  • 前缀表示法(也称为“波兰语表示法”): + XY 运算符被写在其操作数之前。上面给出的表达式等价于
/ * A + B C D

在这些表示法之间转换:单击此处

什么是链表及其类型?

链表是线性数据结构(如数组),其中每个元素都是一个单独的对象。列表的每个元素(即节点)都由两项组成-数据和对下一个节点的引用。

  1. 单链表:在这种链表中,每个节点在列表中存储下一个节点的地址或引用,而最后一个节点的下一个地址或引用为NULL。例如1-> 2-> 3-> 4-> NULL
  2. 双链表:在这里, 这是与每个节点关联的两个引用,其中一个引用指向下一个节点,一个指向上一个节点。例如。 NULL <-1 <-> 2 <-> 3-> NULL
  3. 循环链表:循环链表是一个链表,其中所有节点都连接在一起形成一个圆。最后没有NULL。循环链表可以是单循环链表,也可以是双循环链表。例如。 1-> 2-> 3-> 1 [最后一个节点的下一个指针指向第一个]

图的BFS和DFS使用哪些数据结构?

  • 队列用于BFS
  • 堆栈用于DFS。 DFS也可以使用递归实现(请注意,递归还使用函数调用堆栈)。

可以在每个节点中使用单个指针变量来实现双链接吗?
可以使用单个指针来实现双链表。请参见“异或”链接列表–内存有效的双链接列表

如何使用队列实现堆栈?
可以使用两个队列来实现堆栈。假设要实现的堆栈为“ s”,用于实现的队列为“ q1”和“ q2”。堆栈’s’可以通过两种方式实现:

  • 方法1(通过使推送操作昂贵)
  • 方法2(通过增加弹出操作的开销)请参阅使用队列实现堆栈

如何使用堆栈实现队列?
队列可以使用两个堆栈来实现。令要实施的队列为q,而用于实施q的堆栈为stack1和stack2。 q可以通过两种方式实现:

  • 方法1(通过使enQueue操作变得昂贵)
  • 方法2(通过使deQueue操作昂贵)请参阅使用堆栈实现队列

应该使用哪种数据结构来实现LRU缓存?

我们使用两种数据结构来实现LRU缓存。

  1. 使用双向链表实现的队列。队列的最大大小将等于可用帧的总数(缓存大小)。最近使用的页面将在后端附近,而最近使用的页面将在前端附近。
  2. 一个以页码为键且相应队列节点的地址为值的哈希值。请参阅如何实施LRU缓存方案?应该使用什么数据结构?

如何检查给定的二叉树是否是BST?
如果对二叉树的有序遍历进行排序,则该二叉树为BST。这个想法是简单地进行有序遍历,并在遍历的同时跟踪先前的键值。如果当前键值更大,则继续,否则返回false。有关更多详细信息,请参见检查二进制树是否为BST的程序。

链表问题

  • 链表插入
  • 链表删除
  • 给定链表的中间
  • 链表末尾的第N个节点

树遍历问题

  • 为了
  • 前置和后置遍历
  • 级别顺序遍历
  • 二叉树的高度

将DLL就地转换为二叉树
请参阅将已排序的DLL就地转换为平衡的BST

将二叉树就地转换为DLL
请参见将给定的二叉树转换为双链表|设置1,将给定的二叉树转换为双链表|套装2

删除单链列表中的给定节点
在单链列表中仅给出要删除的节点的指针,如何删除它?

反向链接列表
编写函数以反向链接列表

在链接列表中检测循环
编写一个C函数来检测链表中的循环。

字典和拼写检查器使用哪种数据结构?
字典和拼写检查器的数据结构?

你也许也喜欢

  • 关于数据结构的实践测验
  • 最后一分钟笔记– DS
  • 常见面试难题
  • 亚马逊最常问的面试问题
  • 微软最常问的面试问题
  • 埃森哲问得最多的面试问题
  • OOP面试常见问题
  • 常见的C++面试问题,
  • C编程面试常见问题套装1
  • C编程面试常见问题套装2
  • 常见的DBMS面试问题|套装1
  • 常见操作系统面试问题套装1
  • 常见数据结构面试问题
  • 常见算法面试问题