Pointer12. Дан указатель $$P_1$$ на вершину стека, содержащего не менее пяти элементов. Используя тип TStack (см. задание Pointer11), описать функцию Pop ($$S$$) целого типа, которая извлекает из стека $$S$$ первый (верхний) элемент, возвращает его значение и освобождает память, которую занимал извлеченный элемент ($$S$$ — входной и выходной параметр типа TStack) . С помощью функции Pop извлечь из исходного стека пять элементов и вывести их значения. Вывести также указатель на новую вершину стека (если результирующий стек окажется пустым, то этот указатель должен быть равен $$nil$$).
Решение:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
program Pointer12; type PNode=^TNode; TNode=record Data: Integer; Next: PNode; // Prev: PNode; end; TStack=record Top:PNode; end; procedure CreateStack(var P1:PNode); var p:PNode; i,N:integer; begin Write('N:'); Readln(N); p1:=nil; for i:=1 to N do begin new(p); Write('num: '); Readln(P^.Data); p^.Next := P1; P1:=p; end; end; function pop(var S:TStack):integer; var head: PNode; begin Result:=S.Top.Data; head:=S.Top.Next; Dispose(S.Top); S.Top:=head; end; var S:TStack; i:integer; a:^Word; begin CreateStack(S.Top); For i:=1 to 5 do Writeln(Pop(S)); a:=Addr(S.Top); Writeln('addres:',a^); end. |
Другие задачи из раздела Pointer можно посмотреть здесь.
Решение для задачника PT4:
Решение с заполнением стека P1:
Дополнительная проверка в цикле if S.Top = nil then break связана с тем, что при числе элементов N стека меньше 5, функция Pop(S) будет возвращать 0 5-N раз. В данной задаче заранее известно, что число элементов стека не меньше 5. Поэтому тут можно было обойтись и без этой проверки.