Java 如何知道何时使用堆栈而不是其他集合?

Java 如何知道何时使用堆栈而不是其他集合?,java,c#,stack,Java,C#,Stack,下面是我想知道的更一般问题的一个小前奏: 我最近在做一个编程挑战,你应该写一个方法来检查给定字符串中括号的平衡。该方法应该接收一个字符串,并返回第一个额外的“')”或“(”括号)所在的索引,如果它们相等,则返回字符串的长度;“(((asdf)))”-0;“((asdf))”-1;“(ab)((cd)(asdf)”-5 我首先尝试为括号的每个方向创建一个列表,该列表将存储字符串中所有括号的索引。然后,我将遍历字符串中的每个字符,如果匹配,则将其索引添加到任一列表中,并检查它们是否已经不匹配。这种策

下面是我想知道的更一般问题的一个小前奏:

我最近在做一个编程挑战,你应该写一个方法来检查给定字符串中括号的平衡。该方法应该接收一个字符串,并返回第一个额外的“')”或“(”括号)所在的索引,如果它们相等,则返回字符串的长度;“(((asdf)))”-0;“((asdf))”-1;“(ab)((cd)(asdf)”-5

我首先尝试为括号的每个方向创建一个列表,该列表将存储字符串中所有括号的索引。然后,我将遍历字符串中的每个字符,如果匹配,则将其索引添加到任一列表中,并检查它们是否已经不匹配。这种策略适用于某些情况,但某些情况下仍然不匹配ll失败了。我感觉被卡住了,我检查了一些关于挑战的其他答案,看到它们使用一个堆栈来存储左括号的索引,必要时它们会推到左括号中并弹出。这种方法效果好多了,我觉得有点尴尬,因为我自己没有想到它

这就引出了我的问题……我如何知道什么时候在其他各种集合上使用堆栈更好?发生了哪些常见的事情可以提示我在任何其他集合上使用堆栈


我知道堆栈是如何工作的,并在一些教程中使用过它们,但从未真正发现自己在现实世界中使用过它们……在看到它们通过挑战创造的简单性后,我觉得我错过了一些制作更简单/更好代码的机会。

当你需要使用后进先出(后进先出)时 类似于调用函数或使用后缀符号时


正如其他人所说,当您需要收藏具有后进先出(LIFO)行为时,可以使用堆栈。这可以在您处理“最顶层”或“最新”的信息时体现出来

您提到的示例就是一个很好的例子,为了最有效地处理括号组,您将左括号存储在一个集合中,并且在遇到右括号时删除最近的左括号

堆栈也可用于某些树/图遍历算法。深度优先方法将使用堆栈存储仍需遍历的节点列表,因为使用堆栈与一致插入模式相结合具有搜索树的宽度深度的固有特性。(另一方面,宽度优先遍历算法使用队列代替。)

另一种可能的用途是一副牌。在大多数游戏中,你不在乎牌的中心有什么。当玩家需要一张牌时,他们只从顶部抽出一张牌。因为这完全模仿了堆栈的行为,所以堆栈可能是这类应用的一个考虑因素。(毕竟,一副牌)只是一堆卡片。)

还有许多其他的应用程序。它们的共同点是,它们可以在您需要处理集合中最上面的项或最新的项时工作。要知道您的特定应用程序是否会从堆栈中受益,只需要了解如何识别这些场景方面的一些经验


编辑:哦,当然还有.NET用于方法作用域和临时变量的堆栈。它与数据结构共享名称并非巧合。当在方法中声明变量时,它的内存分配会添加到堆栈的末尾。然后当方法返回且变量超出作用域时,该内存从堆栈中弹出并交给垃圾收集器。

堆栈的另一个好例子是当您输入一些最终将离开的“上下文”时。如果您存储的一些信息仅在这两个时刻之间有效,并且在离开此“上下文”后可能会被遗忘,则情况更是如此


在括号示例中,只要匹配
并在匹配
时“离开”括号块),
。当您在括号内时,您需要记住起始
的位置(如果没有匹配的
),但一旦找到匹配的
您可以忘记该信息。

以下是从SO问题复制的选定答案:

我不是剽窃。我写了这个答案


理想情况下,您可以使用或根据需要创建反映真实世界中事物如何工作的类,即您在代码中建模的事物。此类类为我们提供了一个抽象级别,以便我们可以根据建模/模拟的内容进行编码。此外,在编写一些复杂事物时,使用熟悉的范例会有所帮助。也就是说:哦,这个Fuzzinator类使用堆栈。我知道堆栈是什么以及它是如何工作的

第二,更高级别的抽象类为我们提供了有效的代码(我们假设.NET框架已经过测试),并为我们节省了重新发明轮子的时间和痛苦

第三,代码更容易阅读、理解、更改等等,更易于维护

使用具有更精细功能的类有助于限制我们在使用它时可能会犯的错误

总的来说,当您的应用程序在适当的抽象级别进行编码时,它会变得更好

Stack就是这些类之一

我的HP-41X计算器使用堆栈进行算术运算。这种计算方法称为RPN-反向波兰表示法

如果我在模拟自助餐厅,那么这个堆栈将非常适合那堆盘子。盘子从顶部上下堆叠。不是中间,不是末端;只有顶部。一个堆栈。我只能推()和弹出()盘子,这使得代码更简单、更简单