Какой-то загадочный механизм стека в C ++

0

Изучая, как писать быстрый вид, я столкнулся с определенной реализацией, которая для меня очень неясна. Вот начало этого:

void quick_sort_iterative(int start, int end)
{
    range stack[32]; // 1. why 32? why not 2? why not 1024? what is it?
    range * s = stack; // 2. just a simple pointer = an array?
    s->start = start; // 3. are these two values currently on top of the stack?
    s->end = end;
    s++; // 4. how does it work? it pushing something on the stack?

    // sort as long as there are any ranges [start, end] to sort left
    while (s > stack) // 5. comparing a pointer and an array and it works?

Может ли кто-нибудь объяснить мне эти 5 вещей? :) Спасибо.

Вот весь код (последний на странице, с описаниями): code

  • 0
    Не могли бы вы включить всю функцию в вопрос? Трудно понять, для чего используются без всей функции.
  • 1
    stack = &stack[0] . Увеличение указателя перемещает указатель на следующий элемент массива. 32 должно быть достаточно для любого :) Хотя возможно построить массив разумного размера, который потребует углубления, превышающего 32.
Показать ещё 2 комментария
Теги:
stack
quicksort

2 ответа

0
Лучший ответ

Так. Предположительно, range - это некоторый объект с двумя целыми параметрами: start и end. Я не могу сказать гораздо больше.

  1. По какой-то причине разработчики алгоритма считают, что им не понадобится более 32 поддельных фреймов стека.
  2. Массив распадается на указатель. Вы можете думать об этом как &stack[0].
  3. s->start в данный момент совпадает s[0].start.
  4. s теперь указывает на &stack[1].
  5. Массив распадается на указатель. Это верно, если s не указывает на &stack[0].
  • 0
    @MattMcNabb: я пытался немного глубже понять, что эта переменная на самом деле означает в отношении алгоритма. Но, похоже, вопрос № 2 на самом деле является просто вопросом синтаксиса.
  • 2
    В алгоритме быстрой сортировки каждая «глубина» делит массив на 2, поэтому, возможно, было выбрано 32 потому что система имела максимальный размер 2 ^ 32 для сортируемого контейнера.
Показать ещё 3 комментария
0
  1. Может быть, просто номер, выбранный из их нижнего региона, или, возможно, достиг тщательного изучения максимальной глубины стека алгоритма. Я догадываюсь о первом.
  2. Любая переменная массива будет естественным образом распадаться на указатель при использовании в контексте, требующем указателя.
  3. Если вы считаете, что первым элементом массива "стек" является верхний, тогда да.
  4. Учитывая предположение в 3, приращение указателя действительно переместилось бы к следующему элементу вниз в стеке.
  5. См. 2. Предположительно, цикл уменьшает s и они хотят остановиться, когда он снова достиг вершины стека.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню