program new_stack;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
Stack =^Еlеm;
Еlеm = Record
inf : integer;
next : Stack;
end;
Ocher =^och;
och = record
inf : integer;
next : Ocher;
end;
/////////////////////// Добавляем в стек ///////////////////////////////////////
Procedure In_stak(Var Beg:Stack; Sim:integer);
Var x:Stack;
Begin
New(X);
X^.inf:=Sim;
X^.next:=Beg;
Beg:=X;
End;
//////////////////////////// Достаём верхний элемент стека /////////////////////
procedure Out_stak(Var Beg: Stack; Var Flag: Boolean);
Var x: Stack;
Begin
If Beg= Nil then Flag:= false else
Begin
Flag:=true;
X:=Beg;
Beg:=Beg^.next;
Dispose(x);
End;
End;
//////////////////////////////////////////////////////////////////////////////////
//////////////////////// Занесение в очередь ///////////////////////////////////
Procedure writeO(Var BeginO, EndO : Ocher; c : integer);
Var
Elem : Ocher;
Begin
new(Elem);
Elem^.inf := c;
Elem^.Next := Nil;
if BeginO = Nil {проверяем, пуста ли очередь}
then
BeginO := Elem {ставим указатель начала очереди на первый созданный элемент}
else
EndO^.Next := Elem; {ставим созданный элемент в конец очереди}
EndO := Elem; {переносим указатель конца очереди на последний элемент}
End;
///////////////////////////// Чтение из очереди /////////////////////////////////
Procedure readO(Var BeginO : Ocher; Var INF : integer);
Var
Elem : Ocher;
Function FreeO(x1 : Ocher): boolean;
Begin
FreeO := (x1 = Nil);
End;
Begin
if FreeO(BeginO)
then
writeln('Очередь пуста')
else
begin
INF := BeginO^.inf; {считываем искомое значение в переменную с}
Elem := BeginO; {ставим промежуточный указатель на первый элемент очереди}
BeginO := BeginO^.Next;{указатель начала переносим на следующий элемент}
dispose(Elem); {освобождаем память, занятую уже ненужным первым элементом}
end;
End;
var
MY,MY2:Stack;
INF,I,uz,R,S:integer;
BeginO, EndO , O:Ocher;
IO:Boolean;
begin
R:=0;
S:=0;
Randomize;
write ('Input Uz :');
readln(uz);
MY:=nil;
BeginO:=nil; EndO :=nil;
for I := 0 to 10 do
begin
In_stak(MY, random(100));
end;
write ('Ishodn stack :');
while MY <> Nil do
begin
write (My^.inf);
write ('-->');
MY:=My^.next;
end;
readln;
while MY <> Nil do
Begin
Out_stak(My,IO); // из основного стека достали
if MY^.inf <uz then
begin
R:=MY^.inf;
writeO( BeginO, EndO , MY^.inf); {помещаем элемент в очередь }
end
else
begin
if MY^.inf >=uz then
begin
S:=MY^.inf;
In_stak(MY2, MY^.inf);
end;
End;
MY := MY^.next;
End;
/////////////// Вывод стека ////////////////////////////////////////////////
while MY2 <> nil do
begin
write (MY2^.inf);
MY2:=MY2^.next;
end;
/////////////// Вывод Очереди ////////////////////////////////////////////////
while O <> nil do
begin
write (O^.inf);
O:=O^.next;
end;
/////////////// Вывод итогового числа ////////////////////////////////////////////////
writeln ('Iskomoe chislo :');
write ((uz+r)/(uz+s)) ;
readln;
end.
Реализация стеков и очередей
Разбираюсь со стеками и очередями на примере следующей задачи:
“Дан стек, элементами которого являются действительные числа. Сфор¬мировать структуру данных очередь, в которую включить значения тех элементов из стека, которые не превосходят uz. Элементы с найденны¬ми значениями из стека исключить. А также получить:
(uz+r)/(uz+s),
где
r- сумма всех тех значений элементов, которые не превосходят u,
s- сумма значений элементов, больших u.”
Код:
Пожалуйста, помогите разобраться.
Я не могу понять, почему при первом выводе стека на экран он обнуляется. И потом просто программа вылетает с ошибкой, как я понимаю как раз из за того, что стек стал пустым и последующее обращение к нему приводит к падению программы