Wykorzystanie implementacji stosu w JavaScripcie

W dzisiejszym wpisie, przedstawię sposoby na wykorzystanie implementacji stosu do zmiany zapisu liczb z dziesiętnych na dwójkowy oraz na sprawdzanie poprawności zapisu nawiasów. Użyję klasę Stack, którą przedstawiłem, w poprzednim poście.

stosss

Dla przypomnienia, oto klasa stack:

Zamiana zapisu liczb z systemu dziesiętnego na dwójkowy

Nie jest żadną tajemnicą, że system binarny, jest w informatyce bardzo ważny. Jest to język, w którym komunikujemy się z komputerem. Na najbardziej bazowym poziomie, jedyne co nasza maszyna rozumie, to 0 lub 1 – napięcie lub jego brak. Dlatego sposób, na tłumaczenie liczb z systemu ludzkiego (dziesiętnego) na komputerowy (binarny) jest bardzo przydatny 🙂

Algorytm na zamianę systemu liczb z dziesiętnego na dwójkowy jest dość prosty. Liczbę dziesiętną dzielimy przez dwa i zapisujemy resztę. Powtarzamy ten proces, dopóki liczba dziesiętna będzie równa zero. Następnie, zapisane reszty czytamy od tyłu. W ten sposób powstaje nam liczba w systemie binarnym!

przykład:
23/2 = 11, reszta 1
11/2 = 5, reszta 1
5/2 = 2 reszta 1
2/2 = 1 reszta 0
1/2 = 0 reszta 1

wynik: 10111

Myślę, że gołym okiem widać już możliwość wykorzystania tutaj stosu! Napiszę skrypt który, będzie wykonywał operację dzielenia z resztą. Reszta trafi na stos, a operacja powtórzy się dopóki wprowadzona liczba będzie równa 0. Na koniec zdejmiemy liczby ze stosu (stos to FIFO, wiec liczby będą ściągane „od końca”) i tak otrzymamy wynik!

Oto funkcja, która robi to o czym piszę powyżej:

teraz wystarczy stworzyć zmienną, do której przypiszemy to co zwraca funkcja. Na koniec sprawdzamy w konsoli czy wszystko się zgadza.

Funkcja ta nie jest idealna. Należało by sprawdzić czy na pewno wartość przekazywana jest liczbą. Ponadto obsługuje, jedynie dodatnie liczby całkowite. Jednak pomimo tych ograniczeń idealnie ilustruje wykorzystanie implementacji stosu, a o to mi tu głównie chodziło. Przejdźmy do drugiego przykładu.

sprawdzanie poprawności zapisu nawiasów

Kolejnym moim przykładem na wykorzystanie implementacji stosu, będzie sprawdzenie poprawności zapisu nawiasów. Chodzi tu o dokładnie o potwierdzenie, czy wszystkie nawiasy zostały zamknięte, tak jak powinny. Można łatwo wyobrazić sobie potrzebę takiej funkcji w kompilatorze języka programowania. Od nawiasów, niedaleko też do parsowania języków markupowych takich jak XML.

Jak się za to zabrać, i w czym pomoże nam tutaj stos? Przyjrzyjmy się zapisom paru nawiasów:

(())()(()(()));
(())(()(()()));
(())()(());

Podane powyżej są poprawne. Dla każdego otwartego znaku ‚(‚ musi znaleźć się zamykający nawias znak ‚)’. Oczywiście nie wystarczy policzyć ilości jednych i drugich, ponieważ, nie zawsze będzie oznaczać to poprawny zapis. Na przykład:

()())(();

To nie jest poprawny zapis pomimo, że liczba otwierających i zamykających nawias znaków zgadza się.

Za każdy otwarty nawias, musimy sprawdzić najbliższy zamykający go znak. Z pomocą przychodzi nam stos. Zerknijmy na rozwiązującą ten problem funkcję:

Przekazuję funkcji ciąg nawiasów. Następnie przechodzę przez każdy znak. Jeżeli znak jest znakiem otwierającym nawias, dodaje do stosu element. Jeżeli znak jest znakiem zamykającym nawias usuwam element. Musimy też sprawdzić, czy jest co usuwać. Jeżeli funkcja trafi na znak zamykający nawias, a stos jest pusty oznacza to, że mamy znak zamykający nawias, który nie został otwarty. To oznacza, że zapis jest błędny i funkcja zwraca false.

Jeżeli funkcja dojdzie do końca ciągu znaków i stos będzie pusty, oznacza to, że wszystkie nawiasy zostały zamknięte i zwracane jest true. Jeżeli stos nie jest pusty, oznacza to, że jakiś nawias nie został zamknięty. zwracane jest false.

Sprawdźmy jeszcze czy działa poprawnie:

Wszystko funkcjonuje jak należy.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *