首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >既然我们已经有了这么多的数据结构,为什么我们需要堆栈呢?

既然我们已经有了这么多的数据结构,为什么我们需要堆栈呢?
EN

Stack Overflow用户
提问于 2022-05-12 20:19:03
回答 3查看 75关注 0票数 1

为什么我们需要堆栈,因为我们已经有了这么多的数据结构,它们也可以处理反向链接列表和向量中的数据管理?其他数据结构没有的堆栈有什么用处/独特之处?

另外,为什么只有数组和链表与堆栈兼容,为什么向量不能与堆栈兼容?

EN

回答 3

Stack Overflow用户

发布于 2022-05-12 20:36:17

这听起来像个家庭作业问题。我认为最后一个问题是基于一个有缺陷的前提。

首先,堆栈是一个古老的概念.我在汇编代码级别上编写的每一台计算机都使用过它们。因此,它们的存在在一定程度上是出于历史原因。

但这是个有用的概念。堆栈有三个基本操作:

  • Push
  • Peek
  • Pop

他们是一个简单的,先进的,最后的结构。它们对某些类型的语言很有用。有一些基于堆栈概念的编程语言。写起来太容易了。(语言本身)他们挺有趣的。

例如:

代码语言:javascript
复制
8 7 mul

这是PostScript和其他基于堆栈的语言中的法律代码。解释器将其分解为令牌,然后看到一个8并将其推到堆栈上。它看到了7并推动了它。它看到了mul,并且知道多个操作数需要两个操作数,所以它会弹出7,弹出8,乘以它们,并推入56。当该行完成时,堆栈上只有一个56 (加上比这个更早的任何东西)。

在其他解析形式中,堆栈也是非常有用的。我在解析某些类型的输入(如XML)时使用它们。当我到达"end of object“标记时,我会弹出堆栈上的顶部项,然后在输入中遇到的下一件事是处理堆栈项的新顶部。

但是堆栈是一个概念,而不是一个实现。数组、链接列表和向量都是实现堆栈的合理方法。

至于最后一个问题--这是个有缺陷的问题。数组和向量有什么区别?嗯,那可能是语言方面的问题。在C++中,数组是固定长度的(而且我几乎从不使用它们)。我将使用向量来实现堆栈,堆栈的顶部是向量中的最后一项。

这是一个比使用链接列表更轻的答案,这取决于堆栈的大小。(每次你在任何分配的范围之外增长一个向量,代价都会很高,所以如果你没有提前分配足够的空间,链接列表可能会更便宜。)

票数 1
EN

Stack Overflow用户

发布于 2022-05-12 22:26:49

在做了一些阅读和研究之后,我认为:

  1. 为什么我们需要堆栈,因为我们已经有了这么多的数据结构,它们也可以处理反向链接列表和向量中的数据管理?我们需要堆栈,因为它们的特性可以反向存储数据,并输出LIFO中的数据,以及它们的简单性。其他数据结构以顺序顺序存储数据,按最初提供数据的顺序存储数据,堆栈以LIFO方式存储--这是处理应用程序时需要的序列。此外,由于与链表和向量相比,堆栈的使用要简单得多,所以它们是理想的候选者,具有最强大的推送、窥视和pop功能。把它想成这样:“当你有网时,不要用炸弹杀死苍蝇”

  1. ,其他数据结构没有的堆栈有什么特别之处?其他数据结构没有堆栈那么简单,因为堆栈有3种内置功能: push、peek和pop。即使我们可以在向量和链表中存储反向数据,它也要复杂得多。所以把它看作是完成任务的一个简单的工具。把它想成这样:我们使用for -循环,即使我们有一个while循环来完成相同的任务,但是for -循环很短,并且是为特定的目的而构建的,而while循环对于一个for-循环可以完成

的任务来说是更大的,也是有点不必要的。

  1. ,为什么只有数组和链表与堆栈兼容,为什么向量与堆栈不兼容?对于堆栈,我们使用数组和链接列表,而不是向量,因为堆栈是使用向量创建的。提示,提示,弹出,都是向量所具有的特征.另外,在堆栈中存储向量就像在向量中存储向量一样,这是错误的,编译器将抛出一个异常。
票数 1
EN

Stack Overflow用户

发布于 2022-05-14 06:20:47

堆栈是一个ADT (抽象数据类型),由一个数学模型(一个元素序列)和在该模型上执行的一些操作(push、pop、isEmpty、makenull和top)组成。在许多应用程序中,这是您希望在列表上执行的唯一操作:每次删除元素时,都是最近插入到列表中的元素。栈的一个重要应用是调用堆栈,它用于实现过程调用。当过程A调用程序中的过程B时,过程B的新堆栈框架将被推到调用堆栈上。

ADT在Java中称为接口,是规范,而数据结构是关于如何实现这些规范的。可以使用数组数据结构或链接列表数据结构来实现堆栈,其方式是所有五个堆栈ADT操作都可以在O(1)时间内执行。

因此,我不会将堆栈称为数据结构;我将称之为ADT。数据结构的示例包括数组、排序数组、链接列表、双链接列表、二进制搜索树、哈希表、最大堆等。每个数据结构非常适合它们高效执行的子集操作。根据应用程序或算法中出现的操作子集(ADT),可以选择有效执行此操作子集的数据结构。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72221656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档