当前位置: 首页 > 知识库问答 >
问题:

列表的哪一端是最顶端?

花阳辉
2023-03-14

诚然,这似乎是一个愚蠢的问题,但请容忍我。

在一个关于堆栈的问题中,我们要定义一个函数来返回堆栈的“顶部”项。对我来说,我不知道哪一边是“顶部”,因为实际上,任何一边都可能是。

还有一个关于队列的问题,它要求我们定义一个函数,返回队列“前面”的项。同样,任何一方都可以被解释为“正面”

如果问题被改写为“返回列表上的最后一项”或“列表上的第一项”,这是完全有道理的,但不幸的是事实并非如此。

所以我想知道:就基本上只是列表的堆栈/队列而言,“前端”和“顶部”是否都有定义,或者这些术语是否含糊不清?

共有3个答案

洪弘毅
2023-03-14

这取决于你如何添加到列表中。如果你这样做,

stack = []
numbers = [1, 2, 3, 4, 6, 5]
for n in numbers:
  stack.append(n)
print(stack)

然后,堆栈的“顶部”就是末尾。从列表的前面追加时,前面或索引0为顶部。下面是一个计算器的例子。

addStack = []
curNumber = 0
while True:
  n = raw_input("Enter a number or operation.")
  if n.isdecimal():
    addStack.append(int(n))
  if n == "=":
    print("Top number(or last number entered): %i" % (
邓夕
2023-03-14

我认为,严格来说,列表的两端都不一定是堆栈的顶部/队列的前面。数据结构的实现与数据结构的预期行为是分开的。

例如,堆栈表现出后进先出(LIFO)行为。换句话说,存储在堆栈中的最后一个元素是“top”元素。如果您决定将堆栈实现为一个列表,其中每个新元素都被添加到索引0处,并且所有现有元素都被移位1,那么索引0将是您的顶部。另一方面,如果您将堆栈实现为一个列表,其中每个新元素都附加到列表的末尾,那么索引-1将是您的顶部。

尽管如此,前一种实现效率很低,因为每次在堆栈上/下推/弹出值时,都必须移动整个列表,而后一种实现效率更高,因为您可以简单地在列表的末尾添加/删除元素。

另外,为了指出在其他回答/评论中提到的一些我没有明确说明的东西,你的实现也不一定是一个列表。当我说实现和行为是分开的时,这也适用于底层数据结构。

西门正平
2023-03-14

对于基本上只是列表的堆栈/队列,“前端”和“顶部”是否都有定义,或者这些术语是否模棱两可

这个问题建立在一个错误的前提之上,即堆栈/队列“基本上只是列表”。

看看这张图,它展示了python列表是如何存储在内存中的(CPython)

(图片来源:这里)

实际上,实现与堆栈或队列完全不同,实际的列表对象可以遍布内存中的所有位置。

这一点非常明确:如果有人提到堆栈的“顶部”,他们会指的是最近添加到堆栈中的项目。这就是如果你从堆栈中“弹出”就会得到的东西。

这一个有点飘飘然。如果有人指的是队列前面,他们可能指的是最早添加的项目,因为队列通常实现“先进先出”(FIFO)。但是,它确实取决于实现,例如python中还有一个后进先出队列,它的顺序更像一个堆栈。更糟糕的是,还有deques(双端队列),所以你真的需要有更多的上下文来理解CS术语。

 类似资料:
  • 问题内容: 我需要做得好的gui swing java datechooser ..我只从199x中找到一些难看的datepicker 有人知道一个不错的gui datepicker吗? 问题答案: 的SwingLabs有SwingX项目,它提供了一套组件,包括 JXDatePicker (API)与工作时间类,它 支持从日00:00:00 1970年1月1日,GMT开始 。 试试demo,作为一

  • 问题内容: 我目前正在一个项目中,该项目需要保留任何类型的对象(我们没有任何控制权的实现),以便以后可以恢复这些对象。 我们无法实现ORM,因为我们不能在开发时限制我们库的用户。 我们的第一个选择是使用Java默认序列化对其进行序列化,但是当用户开始传递同一对象的不同版本(属性更改的类型,名称等)时,恢复对象存在很多麻烦。 我们尝试使用XMLEncoder类(将对象转换为XML),但是发现缺少功能

  • 对于下面的 url,顶级域名是 .com.cn 还是 .cn https://www.apple.com.cn/mac 给我整不会了 https://buy.cloud.tencent.com/domain

  • 问题内容: 我需要验证列表是否是另一个列表的子集-我想要的只是布尔返回值。 在相交后在较小列表上测试相等性是最快的方法吗?考虑到需要比较的数据集数量,性能至关重要。 根据讨论添加更多事实: 在许多测试中,两个列表中的两个列表是否相同?它作为静态查找表之一来执行。 需要列表吗?事实并非如此-静态查找表可以是执行效果最好的任何内容。动态命令是一种dict,我们从中提取密钥以执行静态查找。 在这种情况下

  • 我刚刚安装了Linux Mint,正在尝试配置SpringSource工具套件,这需要您将其定向到系统“JDK路径”。虽然我还没有在这个系统上显式下载/安装Java,但当我运行更新管理器时,我确实看到了Open JDK get Installet,并在下找到了几个目录(参见下面的屏幕截图)。我的问题是: Spring Tool Suite要求您指定到JDK的路径,我的问题是,我选择哪一个路径,为什

  • 问题内容: 假设我有两个或两个以上相同长度的列表。遍历它们的好方法是什么? ,是列表。 要么 还是我缺少任何变体? 使用一个相对于另一个有什么特别的优势吗? 问题答案: 通常的方法是使用: 这将停止两个iterables时较短且耗尽。另外值得注意的是:(仅适用于Python 2)和(适用于Python 3)。