Mam wrazenie ze nie wiesz jak dziala kolejka.
Przyjmijmy takie cos, dla uproszczenia mamy kolejke ktora pomiesci 5
elementow typu int
;
Dodatkowo potrzebujemy zmiennej pomocniczej ktora powie nam ile elementow obecnie znajduje sie w kolejce. nazwijmy ja rozmiar
Kopiuj
int kolejka[5];
int rozmiar = 0;
Teraz chcesz kolejke FIFO czyli ona dziala tak:
Jesli kolejka jest pusta to ta tablica wyglada tak: {0, 0, 0, 0, 0}
Jesli dodajesz cos do kolejki ty wykonujesz metode dodaj(XXX)
, gdzie XXX to jakas liczba bo dodaj przyjmuje element typu int
.
Teraz kolejka wyglada tak {1, 0, 0, 0, 0}
, a zmienna rozmiar
powinna wynosic 1
.
Teraz dodajmy sobie kilka elementow powiedzmy 4:
Kopiuj
dodaj(2);
dodaj(3);
dodaj(4);
dodaj(5);
I nasza kolejka wyglada tak: {1, 2, 3, 4, 5}
. A zmienna rozmiar = 5;
Ok i teraz dodajmy kolejny element:
I tutaj pojawia sie problem bo chcesz wpisac w adres pamieci poza tablice... - to nalezy obsluzyc.
Nasza funkcja moze wygladac tak:
Kopiuj
void dodaj(int elem)
{
if (rozmiar >= 5) {
cout<<"Kolejka jest pelna. Nie mozna dodac kolejnego elementu";
return;
}
kolejka[rozmiar] = elem;
rozmiar++;
}
I rozwiazalismy jeden problem.
Teraz zalozmy ze mamy kolejke z 5 elementami: {1, 2, 3, 4, 5}
. A zatem zmienna rozmiar = 5;
Jesli chcemy usunac element to powinnismy miec funkcje usun
. Z razji, ze funkcja nazywa sie usun
, nie zwraca ona nic(void
). Zakladamy, ze funkcja usuwa jeden element, czyli nie przyjmuje zadnych parametrow.
Ok jak nasze usuwanie ma wygladac:
Teraz nasza tablica z kolejka wyglada tak: {2, 3, 4, 5, 0}
- moze wygladac inaczej, ale dla uproszczenia przyjmijmy sobie ze wyglada tak..., a rozmiar = 0
;
Widzisz co sie stalo Wszystkie elementy poczawszy od drugiego sie przesunely na poczatek i rozmiar sie zmniejszyl. Ty tego nie robisz!
Teraz usunmy kolejny kilka elementow - powiedzmy 4
Kopiuj
usun();
usun();
usun();
usun();
Usuwajac wszystkie elementy nasza kolejka wyglada tak: {0, 0, 0, 0, 0}
, a rozmiar = 0
I teraz pojawia sie kolejna sytuacja ktorej nie przewidzialas bo co jesli kolejka jest pusta a my chcemy dalej usuwac?
I wiedzac jak dziala kolejka na podstawie zalozen ktore mamy wyzej mozemy zaimplementowac nastepujaca funkcje usuwanie:
Kopiuj
void usun()
{
if (rozmiar < 1) {
return;
}
for (int i=1; i<rozmiar; i++) {
kolejka[i-1] = kolejka[i];
}
rozmiar--;
}
Dodatkowym waznym elementem kolejki jest funkcja zwroc. Defacto ona dziala tak samo jak usun()
tylko zwraca usuniety element. I moze wygladac tak:
Kopiuj
int zwroc()
{
if (rozmiar < 1) {
return NULL;
}
int zwracana_wartosc = kolejka[0];
for (int i=1; i<rozmiar; i++) {
kolejka[i-1] = kolejka[i];
}
rozmiar--;
return zwracana_wartosc;
}
A tutaj masz przyklad jak to dziala: https://wandbox.org/permlink/Q2lnrTrxEI7qMRx6