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
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
.
dodaj(1);
Teraz kolejka wyglada tak {1, 0, 0, 0, 0}
, a zmienna rozmiar
powinna wynosic 1
.
Teraz dodajmy sobie kilka elementow powiedzmy 4:
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:
dodaj(6);
I tutaj pojawia sie problem bo chcesz wpisac w adres pamieci poza tablice... - to nalezy obsluzyc.
Nasza funkcja moze wygladac tak:
void dodaj(int elem)
{
if (rozmiar >= 5) {
cout<<"Kolejka jest pelna. Nie mozna dodac kolejnego elementu";
// tutaj wychodzimy aby nie wykonac kolejnych instrukcji
return;
}
//A tutaj dodajemy element do kolejki i zwiekszamy rozmiar;
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:
usun();
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
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:
void usun()
{
if (rozmiar < 1) {
// Nie mamy co usunac wiec nie usuwamy nic...
return;
}
// Tutaj przepisujemy wszystkie wartosci do przodu (nie jest to najwydajniejsze ale latwo Ci bedzie zalapac)...
//Poczawszy od drugiego elementu(index = 1) wszystkie wartosci wpicujemy w index tablicy o jeden mniejszy :)
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:
int zwroc()
{
if (rozmiar < 1) {
// Nie mamy co zwrocic wiec zwracamy null albo wypisujemy jakis komunikat - whatever...
return NULL;
}
// Pobieramy wartosc przed nadpisaniem jej...
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