Advertisement
Guest User

Untitled

a guest
Jan 20th, 2017
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.20 KB | None | 0 0
  1. (*
  2. * Fronta - funkcia QFull
  3. *)
  4.  
  5. function QFull(Q:TQueue): Boolean;
  6. begin
  7. QFull := (Q.Zac = 1) and (Q.Kon = Q.QMax) or ((Q.Zac - 1) = Q.Kon)
  8. end;
  9.  
  10. (*
  11. * Fronta - funkcia Remove
  12. *)
  13.  
  14. function Remove(Q:TQueue): Boolean;
  15. begin
  16. if (Q.QZac <> Q.QKon) then
  17. begin
  18. Q.QZac = Q.Zac + 1;
  19. if (Q.QZac > Q.QMax) then
  20. Q.QZac := 1;
  21. end;
  22. end;
  23.  
  24. (*
  25. * Rekurzívna ekvivalencia STRUKTUR dvoch binnarnych stromov
  26. *)
  27. function EQTS(Kor1, Kor2: Tuk): Boolean;
  28. begin
  29. if (Kor1 = nil) or (Kor2 = nil) then
  30. EQTS := (Kor1 = Kor2)
  31. else
  32. EQTS := EQTS(Kor1^.LUk, Kor2^.LUk) and EQTS(Kor1^.PUk, Kor2^.PUk)
  33. end;
  34.  
  35.  
  36. (*
  37. * Rekurzívna ekvivalencia dvoch binnarnych stromov
  38. *)
  39. function EQTS(Kor1, Kor2: Tuk): Boolean;
  40. begin
  41. if (Kor1 = nil) or (Kor2 = nil) then
  42. EQTS := (Kor1 = Kor2)
  43. else
  44. EQTS := EQTS(Kor1^.LUk, Kor2^.LUk) and EQTS(Kor1^.PUk, Kor2^.PUk) and
  45. (Kor1^.Data = Kor2^.Data)
  46. end;
  47.  
  48. (*
  49. * PostDelete pre jednosmerný zoznam
  50. *)
  51. var PomUk: Tuk;
  52. begin
  53. if (L.Act <> nil) then
  54. begin
  55. if (L.Act^.UkNasl <> nil) then
  56. begin
  57. PomUk := PomUk^.UkNasl;
  58. Dispose(PomUk);
  59. end;
  60. end;
  61. end;
  62.  
  63. (*
  64. * Rekurzívny zápis CopyTree
  65. *)
  66. function CopyTree(KorOrig:TUk; var KorCopy: TUk);
  67. begin
  68. if (KorOrig <> nil) then
  69. begin
  70. new(KorCopy);
  71. Kor.KorCopy^.Data := KorOrig^.Data;
  72. CopyTree(KorOrig^.LUk, KorCopy^.LUk);
  73. CopyTree(KorOrig^.PUk, KorCopy^.PUk);
  74. end;
  75. else
  76. KorCopy := nil;
  77. end;
  78.  
  79.  
  80. (*
  81. * QuickSort s optimalizovanym zasobnikom
  82. *)
  83. procedure NonRecQuicksort(left, right: integer);
  84. var i,j: integer;
  85. S: TStack;
  86.  
  87. begin
  88. SInt(S);
  89. Push(S, left);
  90. Push(S, right);
  91.  
  92. while not S empty do
  93. begin
  94. Top(S, right);
  95. Pop(S);
  96. Top(S, left);
  97. Pop(S);
  98.  
  99. while left < right do
  100. begin
  101. Partition(A, left, right, i, j);
  102. if ((right - i) > (j - left)) then
  103. begin
  104. Push(S, i);
  105. Push(S, right);
  106. right := j;
  107. end;
  108. else
  109. begin
  110. Push(S, left);
  111. Push(S, j);
  112. Left := i;
  113. end;
  114. end;
  115. end;
  116.  
  117. (*
  118. * MacLarenov algoritmus
  119. *)
  120. i := 1;
  121. Pom := first;
  122.  
  123. while i < Max do
  124. begin
  125. while Pom < i do
  126. Pom := Pole[Pom].Uk;
  127. Pole[i] := Pole[Pom];
  128. Pole[i].Uk := Pom;
  129. i := j + 1;
  130. end;
  131.  
  132. (*
  133. * SiftDown (stable) funkcia
  134. *)
  135. procedure SiftDown(var A:TArr; Left, Right: integer);
  136. var i, j: integer;
  137. Cont: Boolean; (* Řídicí proměnná cyklu *)
  138. Temp: integer; (* Pomocná proměnná téhož typu jako položka pole *)
  139.  
  140. begin
  141. i := Left;
  142. j := 2 * i; (* Index levého syna *)
  143. Temp := A[i];
  144. Cont := j<=Right;
  145.  
  146. while Cont do
  147. begin
  148. if (j < Right) then (* Uzel má oba synovské uzly *)
  149. if (A[j] < A[j+1]) then (* Pravý syn je větší *)
  150. j := j + 1; (* nastav jako většího z dvojice synů *)
  151. if (Temp >= A[j] ) then (* Prvek Temp již byl posunut na své místo; cyklus končí *)
  152. Cont := false
  153. else
  154. begin (* Temp propadá níž, A[j] vyplouvá o úroveň výš *)
  155. A[i] := A[j]; (* *)
  156. i := j; (* syn se stane otcem pro příští cyklus"*)
  157. j := 2 * i; (* příští levý syn *)
  158. Cont := j<=Right; (* podmínka : "cyklus pokračuje" *)
  159. end;
  160. end;
  161. A[i]:=Temp; (* konečné umístění prosetého uzlu *)
  162. end;
  163.  
  164. (*
  165. * Post order
  166. *)
  167. procedure ​PostOrder​(var List:TList; UkTree:TUk);
  168. var Zleva: Boolean;
  169.  
  170. begin
  171. SInitBool; (* inicializace zásobníku booleovských hodnot *)
  172. SInitUk; (* inicializace zásobníku ukazatelů *)
  173. InitList(List); 250
  174. InsertFirst(List,0); (* vytvoření hlavičky *)
  175. Nejlev(UkTree);
  176.  
  177. while not SEmptyUk do
  178. begin
  179. TopBool(Zleva); PopBool;
  180. TopUk(UkTree);
  181. if Zleva then
  182. begin
  183. PushBool(false); (* vložení příznaku "příště přijde zprava" *)
  184. Nejlev(UkTree^.PUk);
  185. end;
  186. else
  187. begin
  188. PopUk;
  189. PostInsert(List, UkTree^.Data); (* postupné vkládání do seznamu *)
  190. SuccList(List); (* postup aktivity *)
  191. end;
  192. end;
  193. DeleteFirst(List); (* zrušení nepotřebné hlavičky *)
  194. end;
  195.  
  196.  
  197. procedure DDeleteFirst (var DList:TDList);
  198. var DPomUk:TDUk;
  199. begin
  200. with DList do
  201. begin
  202. if (Zac <> nil) then
  203. begin
  204. DPomUk := Zac;
  205. if (Zac = Kon) then
  206. begin
  207. Zac := nil;
  208. Kon := nil;
  209. Act := nil;
  210. MarkUsable := false;
  211. end
  212. else
  213. begin
  214. if Zac=Act then
  215. Act:=nil;
  216. if Zac = Mark then
  217. MarkUsable := false;
  218. Zac := DPomUk^.Puk;
  219. Zac^.LUk := nil;
  220. end;
  221. dispose(DPomUk);
  222. end;
  223. end;
  224. end;
  225.  
  226. procedure DeleteFirst(var L:TList);
  227. var PomUk:TUk;
  228. begin
  229. if (L.Zac <> nil) then
  230. begin
  231. PomUk := L.Zac;
  232. if (L.Zac = L.Act) then
  233. L.Act := nil;
  234. L.Zac := L.Zac^.Uk;
  235. if (L.Zac = nil) then
  236. L.Kon := nil;
  237. if (PomUk = L.Mark) then
  238. begin
  239. L.MarkUsable := false;
  240. L.Mark := nil
  241. end;
  242. dispose(PomUk);
  243. end;
  244. end;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement