Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Перетасовать элементы TStack  [new]
LiYing
Member

Откуда:
Сообщений: 640
Для TStrings это можно сделать так:
procedure Shuffle(Strings: TStrings);
begin
  for var i := Strings.Count-1 downto 1 do 
    Strings.Exchange(i, Random(i+1));
end;


А как сделать подобное для стека? Желательно без копирования в другие структуры.
type
  TEdge = record
    x,y,dir: Integer;
  end;

  edges: TStack<TEdge>;  
20 фев 21, 12:12    [22284005]     Ответить | Цитировать Сообщить модератору
 Re: Перетасовать элементы TStack  [new]
alekcvp
Member

Откуда:
Сообщений: 2730
"Как мне запрячь лошадь в мерседес, желательно без дополнительных устройств. С телегой это делается так: ..."

Стэк как бы придуман для того, чтобы его элементы сохраняли свой порядок. Так что единственный вариант, который я вижу - написать хэлпер/наследника, добавив метод Shuffle(). И то не факт, что получится получить доступ к его элементам, возможно придётся писать свой аналог полностью.
20 фев 21, 12:21    [22284008]     Ответить | Цитировать Сообщить модератору
 Re: Перетасовать элементы TStack  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 62404
А в чём смысл вообще использовать стэк, чтобы использовать его не как стэк?

Posted via ActualForum NNTP Server 1.5

20 фев 21, 12:23    [22284011]     Ответить | Цитировать Сообщить модератору
 Re: Перетасовать элементы TStack  [new]
LiYing
Member

Откуда:
Сообщений: 640
Гаджимурадов Рустам
А в чём смысл вообще использовать стэк, чтобы использовать его не как стэк?

После перемешивания далее он и будет использоваться как стэк, со всеми его фичами.
Но раз "нет", так нет - пойду другим путем. Вопрос снимается.

Сообщение было отредактировано: 20 фев 21, 12:24
20 фев 21, 12:25    [22284013]     Ответить | Цитировать Сообщить модератору
 Re: Перетасовать элементы TStack  [new]
defecator
Member

Откуда:
Сообщений: 39683
LiYing
Гаджимурадов Рустам
А в чём смысл вообще использовать стэк, чтобы использовать его не как стэк?

После перемешивания далее он и будет использоваться как стэк, со всеми его фичами.


как-то сложно представляю, какое применение вот этому всему
20 фев 21, 12:31    [22284016]     Ответить | Цитировать Сообщить модератору
 Re: Перетасовать элементы TStack  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 62404
Нет, теоретически можно придумать что-то вроде решафл
барабана лотереи или колоды карт, но сама логика странная.

Posted via ActualForum NNTP Server 1.5

20 фев 21, 12:35    [22284018]     Ответить | Цитировать Сообщить модератору
 Re: Перетасовать элементы TStack  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 62404
Т.е. это должен быть наследник (или не наследник),
который расширяет интерфейс стэка, как минимум,
одним методом Shuffle.

По ходу и другие требования всплывут, наверняка.

Posted via ActualForum NNTP Server 1.5

20 фев 21, 12:37    [22284019]     Ответить | Цитировать Сообщить модератору
 Re: Перетасовать элементы TStack  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 587
defecator
как-то сложно представляю, какое применение вот этому всему

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

По теме: либо своя реализация, либо перетаскивать в промежуточное хранилище и заполнять стек заново. Либо допапываться до прямого доступа к элементам, если методы не строго приватные
20 фев 21, 12:38    [22284021]     Ответить | Цитировать Сообщить модератору
 Re: Перетасовать элементы TStack  [new]
alekcvp
Member

Откуда:
Сообщений: 2730
Fr0sT-Brutal,

Зачем вообще стек, если смысл - получать элементы в случайном порядке?.. Проще TList взять, перемешать и вызывать Extract(Last).

Сообщение было отредактировано: 20 фев 21, 12:49
20 фев 21, 12:55    [22284027]     Ответить | Цитировать Сообщить модератору
 Re: Перетасовать элементы TStack  [new]
LiYing
Member

Откуда:
Сообщений: 640
alekcvp
Проще TList взять, перемешать и вызывать Extract(Last).

Именно так я и сделал. Давайте уже закроем эту тему, лучше вон с Ruby помогите :)
20 фев 21, 13:00    [22284032]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить