Консультация № 197587
16.01.2020, 21:17
0.00 руб.
0 10 1
Здравствуйте! У меня возникли сложности с таким вопросом:

Создать стек из случайных целых чисел и поменять местами крайние элементы.

Pascal

Приложение:
Pascal

Обсуждение

давно
Старший Модератор
31795
6196
17.01.2020, 13:38
общий
Адресаты:
В стеке нет крайних элементов, есть один - последний.
Вы имеете ввиду - последний с предпоследним?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Студент
402651
154
17.01.2020, 19:30
общий
18.01.2020, 00:20
это ответ
Здравствуйте, rail!
Ну, типо...
[code lang=pascal]program Stek;

uses
crt;{Для использования readkey и clrscr}

type
Tinf = integer;{тип данных, который будет храниться в элементе стека}
List = ^TList;{Указатель на элемент типа TList}
TList = record {А это наименование нашего типа "запись" обычно динамические структуры описываются через запись}
data: TInf; {данные, хранимые в элементе}
next: List; {указатель на следующий элемент}
end;

{Процедура добавляющая элемент в стек}
procedure AddElem(var stek1: List; znach1: TInf);
var
tmp: List;
begin
GetMem(tmp, sizeof(TList)); {выделяем в памяти место для нового элемента}
tmp^.next := stek1; {указатель на следующий элемент "направляем" на вершину стека}
tmp^.data := znach1; {добавляем к элементу данные}
stek1 := tmp; {вершина стека изменилась, надо перенести и указатели на неё}
end;

{Процедура вывода стека}
procedure Print(stek1: List);
begin
if stek1 = nil then {проверка на пустоту стека}
begin
writeln('Стек пуст.');
exit;
end;
while stek1 <> nil do {пока указатель stek1 не станет указывать в пустоту}
begin{а это произойдёт как только он перейдёт по ссылке последнего элемента}
Write(stek1^.data, ' '); {выводить данне}
stek1 := stek1^.next{и переносить указатель вглубь по стеку}
end;
end;

procedure change(var yk: List);
var
tmp, tmp1: List;
begin
if yk = nil then
exit;
tmp := yk;
while tmp^.next <> nil do
tmp := tmp^.next; {ставим tmp на последний элемент}
tmp1 := yk;
while tmp1^.next <> tmp do {tmp1 ставим на предпоследний элемент}
tmp1 := tmp1^.next;
if tmp1 = yk then {в стеке два элемента}
begin
yk^.next := nil;
tmp^.next := yk;
yk := tmp;
end
else
begin
tmp1^.next := yk;
tmp^.next := yk^.next;
yk^.next := nil;
yk := tmp;
end;
end;

{Процедура освобождения памяти занятой стеком}
procedure FreeStek(stek1: List);
var
tmp: List;
begin
while stek1 <> nil do {пока stek1 не станет указывать в "пустоту" делать}
begin
tmp := stek1; {указатель tmp направим на вершину стека}
stek1 := stek1^.next; {вершину стека перенесём на следующий за данной вершиной элемент}
FreeMem(tmp, sizeof(Tlist)); {освободим память занятую под старую вершину}
end;
end;

var
yk: List; {Указатель на "начало" стека}
n: integer;
znach: Tinf;

begin
randomize;
repeat
clrscr;
Writeln('Введите количество элементов в стеке ');
Write('N= ');
readln(n);
until n > 0;
while n > 0 do
begin
znach := random(1000);
AddElem(yk, znach);
dec(n);
end;
clrscr;
Writeln('Стек до уменьшения ');
Print(yk);
change(yk);
Writeln;
Writeln('Стек после уменьшения ');
Print(yk);
readln;
FreeStek(yk);
end.[/code]
давно
Студент
402651
154
18.01.2020, 00:29
общий
Адресаты:
Доброго времени суток...
- В стеке нет крайних элементов, есть один - последний.
Вы имеете ввиду - последний с предпоследним?
- но уточнений не было...
давно
Посетитель
403300
9
23.01.2020, 14:10
общий
Адресаты:
первый и последний имеется ввиду
давно
Посетитель
403300
9
23.01.2020, 14:11
общий
Адресаты:
здравствуйте, первый и последний элемент стека..
давно
Старший Модератор
31795
6196
23.01.2020, 15:42
общий
Адресаты:
Это уже не стек, а очередь - почитайте это.
На этот вопрос Вам дал ответ .
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
403300
9
23.01.2020, 16:11
общий
23.01.2020, 16:20
Адресаты:
я вас поняла , в любом случае не работает данный код, можете помочь пожалуйста


давно
Старший Модератор
31795
6196
23.01.2020, 17:08
общий
Адресаты:
А так:

[code lang=pascal]type
pList=^tList;
tList=record
value:integer;
next:pList;
end;
const
n=6;
var
head,tail,temp:pList;
a:integer;
begin
head:=nil;
for a:=1 to n do
begin
new(tail);
tail^.value:=random(100);
tail^.next:=head;
head:=tail;
end;
tail:=head;
while tail^.next<>nil do
begin
write(tail^.value:4);
tail:=tail^.next;
end;
writeln(tail^.value:4);
temp:=head;
tail^.next:=head^.next;
head:=tail;
while tail^.next<>head do tail:=tail^.next;
tail^.next:=temp;
temp^.next:=nil;
tail:=head;
while tail^.next<>nil do
begin
write(tail^.value:4);
tail:=tail^.next;
end;
writeln(tail^.value:4);
while head<>nil do
begin
tail:=head;
head:=head^.next;
dispose(tail);
end;
end.[/code]
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
403300
9
23.01.2020, 17:12
общий
Адресаты:
спасибо большое,очень выручили
давно
Старший Модератор
31795
6196
23.01.2020, 17:34
общий
Цитата: rail
если даже имеется ввиду последний и предпоследний ,

Там меньше "телодвижений"
[code lang=pascal]type
pA=^tA;
tA=record
a:integer;
b:pA;
end;
var
a,b:pA;
c:integer;
begin
a:=nil;
for c:=1 to 10 do
begin
new(b);
b^.a:=random(100);
b^.b:=a;
a:=b;
end;
b:=a;
while b<>nil do
begin
write(b^.a:4);
b:=b^.b;
end;
writeln;
b:=a^.b;
a^.b:=b^.b;
b^.b:=a;
a:=b;
while b<>nil do
begin
write(b^.a:4);
b:=b^.b;
end;
repeat
b:=a;
a:=a^.b;
dispose(b)
until a=nil;
end.[/code]
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа