Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.09.2015, 23:48   #1
Lizoveta
Пользователь
 
Регистрация: 22.06.2013
Сообщений: 44
По умолчанию Паскаль. Вывод очереди в обратном порядке

Добрый вечер.
Можно ли как-то вывести очередь в обратном порядке, не создавая при этом еще одну очередь или превращая её в стек?
И если да, то, подскажите как, пожалуйста

Код:
procedure p3(var pbegin: pt);
var u1,u2: pt;
    p,pend: pt;
begin
     p:=pbegin;
     while p<>nil do begin
           pend:=p;
           p:=p^.next;
     end;
     writeln(pend^.famil);
     writeln(t, pend^.famil);
end;
Вот таким образом я вытаскиваю последний элемент, но я не представляю как мне добавить след. цикл который шел бы до предпоследнего, а затем до предпредпоследнего элемента и т.д. Или как удалить последний элемент очереди. Когда из очереди удаляют вроде как только из начала.
Объясните, пожалуйста

Последний раз редактировалось Lizoveta; 27.09.2015 в 23:52.
Lizoveta вне форума Ответить с цитированием
Старый 28.09.2015, 00:27   #2
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

так и организуй свою очередь так, чтобы к ней был доступ с любого конца.
чо голову-то ломать?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 28.09.2015, 06:47   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Можно ли как-то вывести очередь в обратном порядке, не создавая при этом еще одну очередь или превращая её в стек?
Тогда это уже не очередь... Это над тобой так препод надглумился?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.09.2015, 09:54   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

согласен с коллегами - это извращение!

Но можно и это сделать.
Цитата:
Вот таким образом я вытаскиваю последний элемент, но я не представляю как мне добавить след. цикл который шел бы до предпоследнего, а затем до предпредпоследнего элемента и т.д.
вызываешь перебор элементов очереди и считаешь, сколько в этой очереди элементов (пусть это будет N).
Потом цикл I от N до 1
в цикле перебор с счётчиком j, как только счётчик j стал равным переменной цикла i, тогда вывод значения.


об эффективности вообще говорить нельзя, в этом "алгоритме" она ниже плинтуса.
Но извращенное задание будет выполнено (не менее извращённым способом!)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 28.09.2015, 10:29   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
не создавая при этом еще одну очередь или превращая её в стек
Сделай двунаправленную очередь - второй очереди не надо и не стек, хотя его свойствами и обладает. Иначе только извращаться, способом, который Серж предложил
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 28.09.2015, 10:56   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Аватар, я бы тоже этот вариант предложил (двунаправленный список идеален для вывода как в прямом, так и в обратном направлениях), но меня смутило ограничение в задании:
Цитата:
не создавая при этом еще одну очередь или превращая её в стек
поэтому я выше и предложил извращение с перебором в цикле...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 28.09.2015, 11:28   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

извращение с РЕКУРСИЕЙ, которая на самом деле тот же СТЕК, но которого в программе в явно указанном виде НЕТ.

Код:
procedure PrintQuery(var q: TQuery);
var
   x: val; // локальная переменная для "временного" хранения значений из очереди. (на самом деле это будет СТЕК, рекурсия ЖЕ)
begin
   if q.IsEmpty then Exit;//завершение рекурсии по исчерпании очереди
   x:=q.Pop; //достали и сохранили, но не вывели
   PrintQuery(q); // ВЫВОД остатка очереди ( в результате рекурсии первым будет ВЫВЕДЕН последний элемент очереди)
   print(x); // вывод НАЧАЛА после окончания остального вывода
end;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 28.09.2015 в 11:35.
evg_m вне форума Ответить с цитированием
Старый 28.09.2015, 12:16   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

evg_m, точно! Это оптимальное решение в рамках заданных ограничений!

Как я мог про рекурсию забыть?...
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод из БД в обратном порядке Parallelogram PHP 10 22.05.2014 07:35
Вывод строк из файла в обратном порядке yul_2012 Помощь студентам 1 12.12.2012 20:53
Вывод строк из файла в обратном порядке yul_2012 Помощь студентам 0 11.12.2012 22:44
Вывод кольцевого списка в обратном порядке parinoff Паскаль, Turbo Pascal, PascalABC.NET 5 22.11.2008 12:03