Стеки и очереди являются абстрактными типами данных, которые имеют свое собственное чувство порядка, то есть LIFO (последний пришел первым вышел) для стеков и FIFO (первый пришел первым вышел) для очередей.Таким образом, нет смысла брать очередь / стек и переупорядочивать их элементы.
Ссылки в Википедии
В стеке против вектора
Вы можете заметить, что в Java java.util.Stack
extends
java.util.Vector
, и поскольку имеет смысл отсортировать Vector
, возможно, имеет смысл также отсортировать Stack
.Это не тот случай, однако;тот факт, что Stack extends Vector
на самом деле является ошибкой дизайна .Стек НЕ вектор.
Смежные вопросы
При использовании Collections.sort
в java.util.Stack
Несмотря на то, что нет смысла использовать, скажем, быструю сортировку в стеке, вы CAN фактически используете Collections.sort
на java.util.Stack
.Зачем?Поскольку из-за ошибки проектирования (это не может быть подчеркнуто достаточно!), java.util.Stack
- это 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"
Обратите внимание, что элементы печатаются в порядке убывания: это из-за реализации java.util.Stack
.Он выдвигается и всплывает с конца Vector
.Вам не нужно знать , чтобы знать это;Вы не должны были знать это;но это факты.
При использовании соответствующей структуры данных
В зависимости от того, что вы пытаетесь достичь, TreeSet
может быть соответствующей структурой данных.Это Set
, поэтому он не допускает дублирование элементов.
NavigableSet<Integer> nums = new TreeSet<Integer>();
nums.add(5);
nums.add(3);
nums.add(1);
nums.add(2);
nums.add(6);
System.out.println(nums.pollFirst()); // prints "1"
System.out.println(nums.pollFirst()); // prints "2"
nums.add(4);
System.out.println(nums.pollFirst()); // prints "3"
System.out.println(nums.pollFirst()); // prints "4"