odpowiedzi do zadań
Transkrypt
odpowiedzi do zadań
Algorytmy i programowanie – 9 Stosy i kolejki - odpowiedzi 1. Opracować i zaimplementować algorytm scalający dwa posortowane rosnąco ciągi (a1 , a2 , . . . , an ) i (b1 , b2 , . . . , bm ) umieszczone na stosach A i B odpowiednio. Wynik sortowania należy włożyć na stos C, tak aby ciąg na stosie C był posortowany: a) malejąco, b) rosnąco. Odp.1. Zdefiniujmy poniższe dwie funkcje ScalStosy(A, B) i OdwrocStos(A): stock procedure ScalStosy(A, B) stock procedure OdwrocStos(A) while not (StockEmpty (A) or StockEmpty (B)) while not StockEmpty (A) do if Peek (A) ¬ Peek (B) then Push (C, Pop (B)) do Push (C, Pop (A)) OdwrocStos ← C else Push (C, Pop (A)) while not StockEmpty (A) do Push (Pop (A)) while not StockEmpty (B) do Push (Pop (B)) ScalStosy ← C Jasne jest, że dla przypadku a) wystarczy wywołać funkcję ScalStosy(A, B) a w przypadku b) algorytm mógłby wyglądać następująco: ScalRosnacoStosy(A, B) C ← ScalStosy (A, B) C ← OdwrocStos (C) return C 2. Opracować algorytm wykorzystujący stos do wyznaczenia przedstawienia binarnego zadanej liczby n. Przedstawić go w pseudokodzie i zaimplementować w Pascal. Odp.2. procedure PostacBinarna(n) k←n while not (k = 0) do Push (C, k mod 2) k ← k div 2 while not StockEmpty (C) do wypisz Pop (C) 3. Wykorzystując trzy stosy zaimplementować algorytm rekurencyjny ilustrujący rozwiązanie problemu wież Hanoi. Odp.3. Algorytm był przedstawiony na wykładzie. procedure Hanoi(n, A, B, C) if n = 1 then Push (B, Pop (A)) tu jest miejsce na wyświetlenie stanu stosów else Hanoi (n − 1, A, C, B) Push (B, Pop (A)) tu jest miejsce na wyświetlenie stanu stosów Hanoi (n − 1, C, B, A) Implementacja w języku Pascal wieze hanoi.dpr. 4. Dodać sygnalizację błędów w implementacji kolejki kolejki.dpr. Odp.4. Należało uzupełnić procedurę Enqueue i funkcję Dequeue tak, aby możliwa była obsługa błędu przepełnienia i niedomiaru. Poniżej zaproponuję rozwiązanie wykorzystujące dodatkowy parametr kolejki jakim będzie size [Q] , początkowo ustawiony na wartość 0 : procedure Enqueue(Q, x) if size [Q] = length [Q] then error „przepenienie” Q [tail [Q]] ← x if tail [Q] = length [Q] then tail [Q] ← 1 else tail [Q] ← tail [Q] + 1 size [Q] ← size [Q] + 1 integer procedure Dequeue(Q) if size [Q] = 0 then error „niedomiar” x ← Q [head [Q]] if head [Q] = length [Q] then head [Q] ← 1 else head [Q] ← head [Q] + 1 size [Q] ← size [Q] − 1 5. Opracować i zaimplementować algorytm wyszukiwania zadanego elementu x w kolejce. Uwaga: (1) W wyniku działania algorytmu z kolejki nie mogą „zniknąć” elementy, które w niej były przed uruchomieniem algorytmu. (2) Należy rozwiązać również problem zapętlenia się algorytmu! Odp.5. QueueSearch(Q, x) tail ← tail [Q] zapamiętujemy gdzie był ogon kolejki repeat y ← Dequeue [Q] zdejmujemy z czoła kolejny element Enqueue (Q, y) i umieszczamy go na końcu kolejki until (tail = head [Q]) or (y = x) jeżeli przejrzeliśmy całą kolejkę tail = head [Q] albo znaleźliśmy element x, więc kończymy szukanie if y = x then wypisz „znaleziony” else wypisz „nieznaleziony” 6. Jak zaimplementować dwa stosy w jednej tablicy, tak aby błąd przepełnienia wystąpił dopiero, gdy cała tablica będzie wypełniona. Odp.6. Tablicę S [1..n] wypełniać będziemy w następujący sposób: (1) w polach S [1] , S [2] , . . . , S [k] tablicy S zawarte będą elementy stosu S1 , (2) w polach S [n] , S [n − 1] , . . . , S [l] tablicy S zawarte będą elementy stosu S2 , gdzie k < l, w przeciwnym przypadku następuje przepełnienie stosów. Poniżej procedury i funkcje dla obydwu stosów: StockEmpty(nr) Pop(nr) if nr = 1 if StockEmpty (nr) then if top [S1 ] = 0 then return true else return false else if top [S2 ] = n then error „niedomiar” else if nr = 1 then top [S1 ] ← top [S1 ] − 1 return S [top [S1 ] + 1] then return true else top [S2 ] ← top [S2 ] + 1 else return false return S [top [S2 ] − 1] Push(x, nr) if nr = 1 then top [S1 ] ← top [S1 ] + 1 else top [S2 ] ← top [S2 ] − 1 if top [S1 ] > top [S2 ] then error „przepełnienie” else if nr = 1 then S [top [S1 ]] ← x else S [top [S2 ]] ← x