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

Podobne dokumenty