我想知道为什么我们总是使用排序算法(如插入排序或合并排序,...)仅用于列表和数组?为什么我们不将这些算法用于堆栈或队列?
答案 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.Stack
是java.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)
首先,堆栈和队列也列出,但具有一些特殊的特征。由于它们是列表,因此您始终可以对它们进行排序,但如果这样做,则可能会更改这些数据结构的属性。
然后在整个代码中使用这些数据结构是没有意义的,并且在某些时候将它们排序为松散我们使用它们的属性。