关于应用于堆栈和队列的排序算法

时间:2010-06-12 13:26:33

标签: java data-structures

我想知道为什么我们总是使用排序算法(如插入排序或合并排序,...)仅用于列表和数组?为什么我们不将这些算法用于堆栈或队列?

6 个答案:

答案 0 :(得分:13)

堆栈和队列是具有自己的顺序感的抽象数据类型,即堆栈的LIFO(后进先出)和队列的FIFO(先进先出)。因此,采用队列/堆栈并对其元素进行重新排序是没有意义的。

维基百科参考


在堆栈与矢量

你可能会注意到在Java中,java.util.Stack extends java.util.Vector,并且因为对Vector进行排序是有意义的,也许对{{{}}进行排序也是有意义的。 1}}。但情况并非如此;事实上Stack实际上是设计错误。堆栈 NOT 是一个向量。

相关问题


Stack extends Vector

上使用Collections.sort

尽管在堆栈上使用快速排序是没有意义的,但 CAN 实际上在java.util.Stack上使用了Collections.sort。为什么?因为 由于设计错误 (这不能强调!),java.util.Stackjava.util.Stack,{{1}你当然可以对java.util.Vector进行排序。这是一个例子:

implements java.util.List

请注意,元素按降序打印:这是因为List的实现方式。它从 Stack<Integer> stack = new Stack<Integer>(); stack.push(1); stack.push(3); stack.push(5); stack.push(2); stack.push(4); Collections.sort(stack); // by virtue of design error!!! System.out.println(stack); // prints "[1, 2, 3, 4, 5]" while (!stack.isEmpty()) { System.out.println(stack.pop()); } // prints "5", "4", "3", "2", "1" 的末尾推送并弹出。你不需要知道这一点;你不应该知道这个;但这些都是事实。


使用适当的数据结构

根据您尝试完成的内容,TreeSet可能是适当的数据结构。它是Set,因此不允许重复元素。

java.util.Stack

答案 1 :(得分:5)

这是因为堆栈或队列的顺序是这些数据结构定义的一部分。如果我们对它们进行排序,它们就不会是堆栈或队列。

答案 2 :(得分:3)

正如其他人所指出的那样,一般来说,订购堆栈和队列是没有意义的。只是为了使图片完整,有一个例外:PriorityQueue,它保持元素的有序。

答案 3 :(得分:2)

堆栈或队列是与序列不同的概念。数组和链接列表代表序列,您可以将它们视为已排序或未排序。

答案 4 :(得分:1)

Stack and Queue有自己独特的结构。 Stack是一种应用后进先出(LIFO)的结构。如果您订购了一个堆栈,那么它将违反LIFO。 认为我在堆栈中添加了7,3,5,4。 如您所知,堆栈只能检索最后添加的元素。每当我们调用pop()方法时,它将检索4。 但是,请考虑您现在对它进行排序。它变成3,4,5,7,当我们pop()时,它将检索7,这是我们添加的第一个元素。这违反了LIFO规则。

同样适用于Queue,因为Queue结构应用First in First Out。如果您有任何疑问,请随时询问。

答案 5 :(得分:0)

首先,堆栈和队列也列出,但具有一些特殊的特征。由于它们是列表,因此您始终可以对它们进行排序,但如果这样做,则可能会更改这些数据结构的属性。

然后在整个代码中使用这些数据结构是没有意义的,并且在某些时候将它们排序为松散我们使用它们的属性。