Pointer10. Дан указатель $$P_1$$ на вершину непустого стека. Создать два новых стека, переместив в первый из них все элементы исходного стека с четными значениями, а во второй — с нечетными (элементы в новых стеках будут располагаться в порядке, обратном исходному; один из этих стеков может оказаться пустым). Вывести адреса вершин полученных стеков (для пустого стека вывести $$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 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
program Pointer10; type PNode=^TNode; TNode=record Data: Integer; Next: PNode; // Prev: 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; procedure split(P1:PNode; var P2,P3:PNode); var Pt2,Pt3,Temp:PNode; begin Pt2:=nil; Pt3:=nil; P2:=nil; P3:=nil; temp:=p1; writeln(temp^.Data); while (temp<>nil) do begin if (temp^.Data mod 2) = 0 then begin if p2= nil then begin p2:=temp; Pt2:=temp; end else begin Pt2^.Next:=temp; Pt2:=Pt2^.Next; end; end else begin if p3 = nil then begin p3:=temp; Pt3:=temp; end else begin Pt3^.Next:=temp; Pt3:=Pt3^.Next; end; end; if temp^.Next = nil then temp:= nil else temp:= temp^.Next; end; Pt2^.Next:=nil; Pt3^.Next:=nil; end; var P1,P2,P3:PNode; begin CreateStack(P1); Split(P1,P2,P3); end. |
Другие задачи из раздела Pointer можно посмотреть здесь.
Решение для задачника PT4:
Решение с заполнением первого стека: