IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> Задача о стеках
Murderer
сообщение 3.04.2007 18:39
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 14
Пол: Мужской
Реальное имя: Арслан

Репутация: -  0  +


Даны три стека, наполненные натуральными числами и четвертый стек пустой. В четвертый стек поместить три числа, являющиеся максимальными числами в первом, втором и третьем стеке. В четвертом стеке числа расположить в порядке неубывания, а в первых трех стеках порядок расположения оставшихся чисел оставить прежним.

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

Уже которую неделю парюсь и все безуспешно... Ну не могу понять я эти стеки.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
klem4
сообщение 3.04.2007 18:41
Сообщение #2


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Все о динамических структурах данных.

Тут был ?


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Murderer
сообщение 3.04.2007 18:50
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 14
Пол: Мужской
Реальное имя: Арслан

Репутация: -  0  +


Там то я был... но мозг видать у меня не может понять или не хочет....

Вот алгоритм решения я знаю.
Сначала из каждого стека находим максимальный элемент. Например, берем первый элемент и записываем его в max и кидаем в 4-й стек... берем сл. элемент и сравниваем с max... если выбранный меньше max, то кидаем его в 4-й стек, а если больше max, то записываем его в max и кидаем в четвертый стек... тем самым находим максимальные элементы в каждом стеке используя 4-й стек... далее идет этап сортировки 3-х максимальных элементов в порядке неубывания... тут я уже затрудняюсь. наверное тут 4-мя стеками не обойтись... видать 5-й стек подключать надо
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 3.04.2007 22:23
Сообщение #4


Гость






Цитата
наверное тут 4-мя стеками не обойтись... видать 5-й стек подключать надо
Можно обойтись четырьмя...

Сначала проходишь по каждому стеку, и находишь максимум в них (простым перекидыванием данных из одного в другой, и запоминанием количества перекинутых элементов), максимум заносится в четвертый стек... А потом из 4-го выбрасываешь элементы в первые 3 (по одному в каждый), и простыми сравнениями определяешь, какой из элементов минимальный, какой средний, а какой максимальный, и заносишь их обратно в четвертый стек в соответствующем порядке...

Как у тебя стеки-то реализованы?
 К началу страницы 
+ Ответить 
Murderer
сообщение 4.04.2007 5:40
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 14
Пол: Мужской
Реальное имя: Арслан

Репутация: -  0  +


Вот именно что никак. У меня даже кода программного нет. Жалко что подфорум про задачи на заказ закрыли временно, а то я готов деньги отдать за решение данной задачи
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
klem4
сообщение 4.04.2007 7:08
Сообщение #6


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


type

TData = Integer;

PTListItem = ^TlistItem;

TListItem = Record
data: TData;
next: PTListItem;
end;

TList = Object

head: PTListItem;

constructor Create;
destructor Destroy;

procedure Push(const data: TData);

procedure GenerateRandomList(const count, rnd: integer);

procedure PrintList;

function FindMax: Integer;


end;

constructor TList.Create;
begin
head := nil;
end;

destructor TList.Destroy;
var
H, T: PTListItem;
begin
H := head;
while (H <> nil) do begin
T := H;
H := H^.Next;
Dispose(T);
end;
end;

procedure TList.Push(const data: TData);
var
T, H: PTListItem;
begin
New(T);
T^.data := data;
T^.Next := nil;

H := Head;

if Head = nil then Head := T else begin
while (Head^.Next <> nil) do Head := Head^.Next;
Head^.Next := T;
Head := H;
end;
end;

procedure TList.PrintList;
var
H: PTListItem;
begin
H := Head;
while (Head <> nil) do begin
writeln(Head^.Data);
Head := Head^.Next;
end;
Head := H;
end;

procedure TList.GenerateRandomList(const count, rnd: Integer);
var
i: Integer;
begin
for i := 1 to count do Push(random(rnd));
end;

function TList.FindMax: Integer;
var
H: PTListItem;
max: TData;
begin
H := Head;
max := -MaxInt;
while (Head <> nil) do begin
if Head^.Data > max then max := Head^.Data;
Head := Head^.Next;
end;
Head := H;
FindMax := max;
end;

var
L: Array [1..4] of TList;
M: Array [1..3] of TData;

i, j, T: Integer;
begin
randomize;

for i := 1 to 3 do begin
L[i].Create;
L[i].GenerateRandomList(Random(5) + 1, Random(10) + 1);
writeln('List#', i);
L[i].PrintList;
M[i] := L[i].FindMax;
end;

for i := 3 downto 2 do
for j := 1 to i - 1 do
if M[j] <= M[j + 1] then begin
T := M[j]; M[j] := M[j + 1]; M[j + 1] := T;
end;

for i := 1 to 3 do L[4].Push(M[i]);

writeln('List#4');

L[4].PrintList;

for i := 1 to 4 do L[i].Destroy;
end.


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 4.04.2007 10:10
Сообщение #7


Гость






klem4, список <> стек ... Вся сложность-то как раз в том, что стеке ты имеешь право только на обращение к первому элементу, все остальные тебе не доступны... Да и про доп. массивы тоже речи не было...
 К началу страницы 
+ Ответить 
klem4
сообщение 4.04.2007 10:19
Сообщение #8


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Цитата
Вся сложность-то как раз в том, что стеке ты имеешь право только на обращение к первому элементу, все остальные тебе не доступны...


И соответственно после обращения этот элемент из стека удаляется, верно ?


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 4.04.2007 10:26
Сообщение #9


Гость






Смотря какую операцию вызывать... Может, удаляется (если вызывать Pop, но тогда ты его имеешь в переменной, и можешь с ним делать все, что захочешь), а может и нет - есть же еще Top, о котором все забывают почему-то (просто просмотр элемента на верхушке стека)...
 К началу страницы 
+ Ответить 
klem4
сообщение 4.04.2007 12:37
Сообщение #10


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Вот что пока выходит:

Добваляем ф-ю Pop, изменяему процедуру Push на функцию и переписываем FindMax:

// заталкивае элемент в стек и возвращает указатель на него
function TList.Push(const data: TData): PTListItem;
var
T, H: PTListItem;
begin
New(T);
T^.data := data;
T^.Next := nil;

H := Head;

if Head = nil then Head := T else begin
while (Head^.Next <> nil) do Head := Head^.Next;
Head^.Next := T;
Head := H;
end;

Push := T;
end;

// выталкивает элемент из стека и возвращает его значение
function TList.Pop: Integer;
var
T: PTListItem;
begin
if Head <> nil then begin
T := Head;
Pop := Head^.Data;
Head := Head^.Next;
Dispose(T);
end;
end;

// ищем максимальный элемент
function TList.FindMax: Integer;
var
BACK: PTListItem;
max, temp: TData;
begin
if Head <> nil then begin
max := Pop; { берем значение 1-го элемента в стеке, выталкаваем его }
BACK := Push(max); { кладем это значение в конец стека, запоминаем адрес этого элемента }
while (Head <> BACK) do begin { пока не дошли до этого элемента }
temp := Pop; { выталкивае следующее значение }
if temp > max then max := temp; { сравниваем }
Push(temp); { заталкиваем обратно }
end;
end;
FindMax := Max;
end;



--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 4.04.2007 12:59
Сообщение #11


Гость






Вариант №2:
type
ttype = integer;

ptitem = ^titem;
titem = object
info: ttype;
next: ptitem;

constructor init(x: ttype; nxt: ptitem);
destructor done;
end;

constructor titem.init(x: ttype;
nxt: ptitem);
begin
info := x;
next := nxt
end;
destructor titem.done;
begin end;

type
pttype = ^ttype;
tstack = object
head: ptitem;

constructor init;
destructor done;

procedure push(x: ttype);
function pop: ttype;
function top: ttype;

function empty: boolean;

procedure print;
end;

constructor tstack.init;
begin
head := nil;
end;
destructor tstack.done;
begin
while not empty do pop
end;

procedure tstack.push(x: ttype);
var p: ptitem;
begin
new(p, init(x, head));
head := p
end;

function tstack.pop: ttype;
var p: ptitem;
begin
pop := -1;
if not empty then begin
p := head;
head := head^.next;

pop := p^.info;
dispose(p, done);
end
else begin
writeln('reading from empty stack');
halt(101)
end;
end;

function tstack.top: ttype;
begin
if empty then top := maxInt
else top := head^.info;
end;

function tstack.empty: boolean;
begin
empty := not assigned(head)
end;

procedure tstack.print;
var p: ptitem;
begin
p := head;
write('(stack) <');
while assigned(p) do begin
write(p^.info, ' ');
p := p^.next
end;
writeln('>')
end;

procedure sort_stack(var st: tstack);

var changed: boolean;

procedure deface(var new_st: tstack; next: ttype);
var X: ttype;
begin
if not new_st.empty then begin
X := new_st.pop;
deface(new_st, X);
end;

if new_st.top < next then begin
X := new_st.pop;
new_st.push(next);
new_st.push(X);
changed := true;
end
else new_st.push(next);
end;

begin
repeat
changed := false;
deface(st, st.pop);
until not changed;
end;


function max_stack(var st: tstack): ttype;

var max_value: ttype;

procedure deface(var new_st: tstack; next: ttype);
var X: integer;
begin
if not new_st.empty then begin
X := new_st.pop;
if max_value < X then max_value := X;
deface(new_st, X);
end;
new_st.push(next);
end;

begin
max_value := st.top;
deface(st, st.pop);
max_stack := max_value;
end;

var
st_arr: array[1 .. 4] of tstack;
i, j: integer;

begin
for i := 1 to 3 do begin
st_arr[i].init;
for j := 1 to random(10) + 10 do
st_arr[i].push(random(1000));
end;

st_arr[4].init;
for i := 1 to 3 do begin
writeln('#', i); st_arr[i].print;
st_arr[4].push(max_stack(st_arr[i]));
end;

sort_stack(st_arr[4]);
writeln('#4'); st_arr[4].print;
end.
 К началу страницы 
+ Ответить 
Murderer
сообщение 4.04.2007 17:44
Сообщение #12


Новичок
*

Группа: Пользователи
Сообщений: 14
Пол: Мужской
Реальное имя: Арслан

Репутация: -  0  +


Спасибо вам огромное! Не ожидал. А как сделать так, чтобы в программе числа вводить? А то вылетает программа
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Murderer
сообщение 4.04.2007 19:33
Сообщение #13


Новичок
*

Группа: Пользователи
Сообщений: 14
Пол: Мужской
Реальное имя: Арслан

Репутация: -  0  +


Простите. Просто я начинающий в паскале и сейчас его упорно изучаю. Куда элементы стека вводить? Подскажите пожалуйста!

Сообщение отредактировано: Murderer - 4.04.2007 19:34
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 4.04.2007 19:46
Сообщение #14


Гость






В той программе, которую я тебе привел, в стек заносятся случайные числа, причем их количество тоже случайно... Если хочешь вводить самостоятельно -
  for i := 1 to 3 do begin
st_arr[i].init;
for j := 1 to random(10) + 10 do
st_arr[i].push(random(1000));
end;


замени на

  for i := 1 to 3 do begin
st_arr[i].init;
k := random(10) + 10;
writeln('stack #', i, ' -> ', k, ' elements ...');
for j := 1 to k do begin
write(' -> '); readln(X); st_arr[i].push(X);
end;
end;
и опиши еще переменные k, X рядом с i, j ...

А чтобы увидеть результаты выполнения программы, перед последним End. добавь ReadLn ...
 К началу страницы 
+ Ответить 
Murderer
сообщение 4.04.2007 20:47
Сообщение #15


Новичок
*

Группа: Пользователи
Сообщений: 14
Пол: Мужской
Реальное имя: Арслан

Репутация: -  0  +


Цитата(volvo @ 4.04.2007 22:46) *

А чтобы увидеть результаты выполнения программы, перед последним End. добавь ReadLn ...

Этому меня еще в школе обучили. Я потом вспомнил. Спасибо!

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Murderer
сообщение 5.04.2007 14:45
Сообщение #16


Новичок
*

Группа: Пользователи
Сообщений: 14
Пол: Мужской
Реальное имя: Арслан

Репутация: -  0  +


А вот в приведенной программе как сделать так, чтобы не код задавал количество элементов в стеках, а самому в программе вводить нужное тебе количество элементов?
Я попробовал убрать строчку с рандомом где k. У меня не вышло. Друзья тоже не смогли это сдлеать.

Сообщение отредактировано: Murderer - 5.04.2007 14:46
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 5.04.2007 14:57
Сообщение #17


Гость






  for i := 1 to 3 do begin
st_arr[i].init;
write('stack #', i, ': size = '); readln(k);
writeln('enter ', k, ' elements ...');
for j := 1 to k do begin
write(' -> '); readln(X); st_arr[i].push(X);
end;
end;
?
 К началу страницы 
+ Ответить 
Murderer
сообщение 5.04.2007 15:00
Сообщение #18


Новичок
*

Группа: Пользователи
Сообщений: 14
Пол: Мужской
Реальное имя: Арслан

Репутация: -  0  +


Да, я видать глупость сморозил. Я хотел просто вместо 10-ки какую-нибудь переменную ввести... Но программа в таком случае не запускалась

Сообщение отредактировано: Murderer - 5.04.2007 15:00
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Murderer
сообщение 5.04.2007 15:44
Сообщение #19


Новичок
*

Группа: Пользователи
Сообщений: 14
Пол: Мужской
Реальное имя: Арслан

Репутация: -  0  +


Все равно не выходит! Что мне исправить, чтобы в программе я сам вводил нужное мне количество элементов?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 5.04.2007 17:12
Сообщение #20


Гость






Так... Давай договоримся, ты присоединяешь СВОЮ программу (в смысле, ту, с которой работаешь), а мы ее смотрим... Только в Аттаче, чтобы не надо было ничего копировать никуда, просто откомпилировать и посмотреть, почему и КАК именно она у тебя не работает...
 К началу страницы 
+ Ответить 

2 страниц V  1 2 >
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 25.06.2025 9:52
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"