Нужна рекрусивная фун-ция вывода нечётных чисел в стеке
volvo
15.11.2005 13:06
To: Dunkel_L Уточни, что именно тебе надо? Удалять из стека ВСЕ числа и распечатывать только нечетные, или ты хочешь оставить стек как он есть, но пройти по нему и напечатать все нечетные числа? (скажу сразу, для этого стек НЕ предназначен, у стека есть только 2 операции: Push(положить в стек) и Pop(изъять из стека), никаких просмотров быть не может.)
+ к этому, сам стек у тебя реализован?
Dunkel_L
15.11.2005 13:51
Да, сам стек реализован. Мне нужно пройти по нему и напечатать все нечетные числа. Если в стеки это нельза, то в очереди можно Тогда помогите в очередь написать фун-цию.(очередь так же реализована)
volvo
15.11.2005 14:02
To: Dunkel_L Мне не хотелось бы тебя огорчать, но это и в очереди не реализуется (Очереди и стек - фактически одно и то же, только у стека и запись и чтение происходят с одной стороны, а у очереди - с разных, но НИ там, НИ здесь нет функции доступа к отдельным элементам)... Из всех динамических структур данных это возможно только в списках. Сейчас подумаю, куда тут рекурсию за уши притянуть (ибо она в таком задании не нужна совершенно...)
Dunkel_L
15.11.2005 14:13
Нам задали, цитирую: Написать рекурсивную процедуру, печатающую нечетные по порядку элементы. Вот так! Может нужно пройтись по шагам по стеку ,выбирая нечётные числа?
volvo
15.11.2005 14:32
To: Dunkel_L Ну пойми, ты не можешь ВЫБИРАТЬ четные или нечетные элементы из стека. Ты обязан это делать со всеми подряд. Обойму пистолета видел? Ты можешь извлечь 3, 5 и 7 патрон, не трогая остальных?
Dunkel_L
15.11.2005 20:41
А нельзя ,когда проходишь по стеку и найдя нечётный элемент , создать новый указатель? И так каждый раз при нечётном элементе.
volvo
15.11.2005 20:46
Тогда так (используй 2 стека):
stack_1, stack_2: TStack; ... while not stack_1.empty do begin if odd(stack_1.top) then writeln(stack_1.top); stack_2.push(stack_1.pop); end;
while not stack_2.empty do stack_1.push(stack_2.pop); ...
а вот куда здесь рекурсию прицепить - я не знаю...
Дож
19.11.2005 16:43
Код
Procedure oddNumber(var stack_1, stack_2: TStack); begin If not(stack_1.empty) then begin if odd(stack_1.top) then writeln(stack_1.top); stack_2.push(stack_1.pop); oddNumber(stack_1, stack_2); {Рекурсия!} stack_1.push(stack_2.pop); end; end;
Протестировал, вроде бы работает...
Dunkel_L
22.11.2005 7:03
Это всё хорошо, но куда этот код всавить.Теперь с этим помогите(Нужно вывод нечётных чисел забить под клавишу 4).За ранее СПАСИБО.
Вот и сам код
program laba4; Uses CRT; type ptr=^node; node=record info:integer; link:ptr; end; var top,q:ptr; a,b,c,d,s:word; procedure Push(n:integer); var p:ptr; begin new(p); p^.info:=n; p^.link:=top; top:=p;
end;
function Pop:integer; var l:ptr;
begin if top <> nil then
begin l:=top^.link; Pop:=top^.info; dispose (top); top:=l; end else begin Writeln(' !Ошибка:Стэк пуст'); pop:=0; end; end;
procedure menu; var n:integer; begin write(' Введите команду и нажмите ВВОД: '); read(a);
if a=1 then begin write(' Введите число: '); readln(b); Push(b); menu; end else if a=2 then begin Writeln; Write(Pop); writeln(' удалено из стека'); menu; end else
if a=3 then begin Write(' Стэк:'); q:=top; while q<>nil do begin write(q^.info,' '); q:=q^.link;
end; Writeln; menu; end
else if a>=6 then Begin Writeln; Writeln(' Ввод не коректен '); Writeln(' Введите команду ещё раз (от 1 до 5)'); Writeln; menu; end; end; begin clrscr; writeln(' 1-Ввод числа стека'); writeln(' 2-Удаление числа из стека'); writeln(' 3-Вывод стека на экран'); writeln(' 4-Вывод нечётных чисел стека на экран'); writeln(' 5-Выход из программы'); menu; end.
volvo
22.11.2005 10:41
Dunkel_L, ты сначала процедуру menu перепиши как положено (без рекурсии), а потом будешь думать, как добавлять что-то в программу...
Твоя программа вылетит с сообщением Stack Overflow, если ты будешь добавлять/удалять/распечатывать данные достаточно много раз... У тебя Menu вызывает Menu, которая в свою очередь вызывает Menu, ...
Dunkel_L
27.11.2005 19:56
Показал преподу лабу.Всё хорошо работает, НО это не через рекурсию. Мне нужно не создовать новый список, а нужно с одним единственным, через рекурсию.
volvo
27.11.2005 20:01
Цитата
нужно с одним единственным, через рекурсию
Ну, когда научишься из обоймы вытаскивать 3, 5, 7 патроны, НЕ держа остальные в руках, и НЕ ставя их на стол, и в то же время НЕ теряя их, приходи, поделись алгоритмом...
Тебе же объясняют, НЕ ПРЕДНАЗНАЧЕН для этого стек... Нет, ты опять за свое...
volvo
27.11.2005 20:31
А вот обмануть компилятор можно:
procedure Odds(const p: ptr); begin if p = nil then exit; if odd(p^.info) then writeln('next odd = ', p^.info); odds(p^.link); { Рекурсия !!! } end;
После окончания работы этой процедуры top указывает туда же, куда и указывал ДО нее... Но все нечетные элементы уже распечатаны...
Dunkel_L
29.11.2005 14:07
БОЛЬШОЕ СПАСИБО Все нормально, СДАЛ!!! Ура!!!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.