О алгоритмах сортировки, применяемых к стекам и очередям - PullRequest
3 голосов
/ 12 июня 2010

Я хочу знать, почему мы всегда используем алгоритм сортировки, например (сортировка вставкой или сортировка слиянием, ...) только для списков и массивов?И почему мы не используем эти алгоритмы для стека или очереди?

Ответы [ 6 ]

13 голосов
/ 12 июня 2010

Стеки и очереди являются абстрактными типами данных, которые имеют свое собственное чувство порядка, то есть LIFO (последний пришел первым вышел) для стеков и FIFO (первый пришел первым вышел) для очередей.Таким образом, нет смысла брать очередь / стек и переупорядочивать их элементы.

Ссылки в Википедии


В стеке против вектора

Вы можете заметить, что в Java java.util.Stackextendsjava.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"
5 голосов
/ 12 июня 2010

Это потому, что порядок стека или очереди является частью определения этих структур данных. Если бы мы отсортировали их, они не были бы стеками или очередями.

3 голосов
/ 12 июня 2010

Как уже отмечалось, заказывать стеки и очереди вообще не имеет смысла. Для полноты изображения есть исключение: PriorityQueue , в котором элементы упорядочены.

2 голосов
/ 12 июня 2010

Стек или Очередь - это понятия, которые отличаются от Последовательностей.Массивы и связанные списки представляют собой последовательности, в которых вы можете считать их отсортированными или не отсортированными.

1 голос
/ 12 июня 2010

Стек и Очередь имеют свою уникальную структуру.Стек - это структура, которая применяет метод «первым пришел - первым вышел» (LIFO)Если вы заказали стек, то это нарушило бы LIFO.Подумайте, что я добавляю 7, 3, 5, 4 в стек.Как известно, стек может извлекать только последний добавленный элемент.Всякий раз, когда мы вызываем метод pop (), он возвращает 4. Однако, подумайте, что вы теперь сортируете его.Он становится 3, 4, 5, 7, и когда мы pop (), он получает 7, который был первым элементом, который мы добавили.Это нарушает правило LIFO.

То же самое относится и к очереди, поскольку структура очереди применяется в порядке поступления.Если у вас есть какие-либо вопросы, пожалуйста, не стесняйтесь спрашивать.

0 голосов
/ 13 июня 2010

Прежде всего, стек и очереди также перечислены, но имеют некоторые особые характеристики. Поскольку они являются списком, вы всегда можете отсортировать их, но если вы сделаете это, вы можете изменить свойства этих структур данных.

Тогда не будет смысла использовать эти структуры данных в вашем коде и в какой-то момент отсортировать их, чтобы утратить их свойство, для которого мы их использовали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...