Rc3eHnGputwzz
Fotografia przedstawia falującą wodę.

PY_I_R_W13B_M05 Dynamiczne struktury danych. Implementacja

Źródło: Michael Benz, dostępny w internecie: unsplash.com, domena publiczna.

Kolejka

Kolejka to liniowa struktura danych typu FIFO (ang. First‑In, First‑Out – pierwszy na wejściu, pierwszy na wyjściu), co oznacza, że jej elementy odczytywane są zgodnie z kolejnością dodawania, a zatem odwrotnie niż w przypadku stosu.

W implementacji kolejki również użyjemy listy jednokierunkowej i takiej samej jak w przypadku stosu definicji klasy Wezel. Natomiast klasa Kolejka będzie zawierała dwa pola:

  • glowa – referencję na pierwszy element kolejki;

  • ogon – referencję na ostatni element kolejki, który ułatwi dodawanie elementów na końcu listy.

Nazwy pozostałych metod dostosujemy do omawianej struktury.

Linia 1. class Wezel dwukropek. Linia 2. def podkreślnik podkreślnik init podkreślnik podkreślnik otwórz nawias okrągły self przecinek liczba zamknij nawias okrągły dwukropek. Linia 3. self kropka liczba znak równości liczba. Linia 4. self kropka nastepny znak równości None. Linia 6. class Kolejka dwukropek. Linia 7. def podkreślnik podkreślnik init podkreślnik podkreślnik otwórz nawias okrągły self zamknij nawias okrągły dwukropek. Linia 8. self kropka glowa znak równości None. Linia 9. self kropka ogon znak równości None. Linia 11. kratka Poniżej dodamy kolejne metody.

Metoda czy_pusta() działa tak samo, jak w przypadku stosu i każdej listy, tzn. jeżeli referencja na pierwszy element jest pusta, lista jest pusta.

Linia 1. def czy podkreślnik pusta otwórz nawias okrągły self zamknij nawias okrągły dwukropek. Linia 2. return self kropka glowa is None.

Metoda dodaj() będzie dodawała nowe elementy na końcu listy przy użyciu pola ogon.

Linia 1. def dodaj otwórz nawias okrągły self przecinek liczba zamknij nawias okrągły dwukropek. Linia 2. print otwórz nawias okrągły cudzysłów Dodaje dwukropek cudzysłów przecinek liczba zamknij nawias okrągły. Linia 3. nowy znak równości Wezel otwórz nawias okrągły liczba zamknij nawias okrągły. Linia 5. if self kropka czy podkreślnik pusta otwórz nawias okrągły zamknij nawias okrągły dwukropek. Linia 6. self kropka glowa znak równości self kropka ogon znak równości nowy. Linia 7. else dwukropek. Linia 8. self kropka ogon kropka nastepny znak równości nowy. Linia 9. self kropka ogon znak równości nowy.

Na początku metody tworzymy nowy węzeł, przypisujemy otrzymaną liczbę do jego pola liczba, a referencję nastepny ustawiamy na wartość pustą. Następnie, jeżeli lista jest pusta, referencje na pierwszy (glowa) i ostatni (ogon) element listy ustawiamy na nowy węzeł.

W przeciwnym razie referencję nastepny dotychczasowego ostatniego elementu ustawiamy na nowy węzeł i aktualizujemy referencję ogon, aby wskazywał nowo dodany element.

Metoda usun() będzie zwracała kolejne elementy z początku listy, czyli działać będzie tak samo, jak metoda zdejmij() w przypadku stosu. Ponieważ jednak elementy będą dodawane na końcu listy, zasada działania kolejki FIFO zostanie zachowana.

Linia 1. def usun otwórz nawias okrągły self zamknij nawias okrągły dwukropek. Linia 2. if self kropka czy podkreślnik pusta otwórz nawias okrągły zamknij nawias okrągły dwukropek. Linia 3. return minus sys kropka maxsize minus 1. Linia 5. pomocniczy znak równości self kropka glowa. Linia 6. liczba znak równości pomocniczy kropka liczba. Linia 7. self kropka glowa znak równości self kropka glowa kropka nastepny. Linia 8. print otwórz nawias okrągły cudzysłów Usuwam dwukropek cudzysłów przecinek liczba zamknij nawias okrągły. Linia 9. return liczba.
Ćwiczenie 1

Wykorzystaj omówiony kod i przygotuj program pozwalający sprawdzić działanie kolejki. Dodaj do kolejki trzy liczby, wypisz kolejkę, a następnie wywołaj metodę usuwającą cztery razy.

R1LHghliGaqEJ