Prijeđi na sadržaj

Red (struktura podataka)

Izvor: Wikipedija
Prikaz reda

Red je apstraktni tip podataka koji služi za pohranu niza istovrsnih elemenata. Kod reda se podatke (primarno) čita i briše s čela reda (liste), dok se novi podatci zapisuju na začelje reda. Ovo čini red podatkovnom strukturom s pristupom "prvi koji ulazi - prvi izlazi" (engl. FIFO - first in, first out).

Da bi se pristupilo k-tom elementu reda od n elemenata, potrebno je prvo sa stoga maknuti n-k elemenata upisanih prije k-tog, i to po redu elemente broj: n, n-1, n-2, ... k+2, k-1. Drugim riječima, kasnije upisanim elementima pristupa se tek nakon uklanjanja onih ranije upisanih. Podatci se kod ovakvog reda, suprotno od stoga, čitaju istim redoslijedom kojim su bili upisivani.

Operacije za rad s redom

[uredi | uredi kôd]

Osnovne operacije

[uredi | uredi kôd]
  • IsEmpty - Pokazuje je li red prazan.
  • Front - Vraća vrijednost s čela reda.
  • EnQueue - Stavlja vrijednost na začelje reda.
  • DeQueue - Briše element s čela reda.

Napredne operacije

[uredi | uredi kôd]

Napredne operacije vezane su uz modifikacija reda. Tako npr. red s dva kraja bez ograničenog ulaza (opisan kasnije) razlikuje EnQueue_front (dodavanje na početak) i EnQueue_back. Implementirajući takve mogućnosti apstraktni tip podataka gubi svojstva jednostavnog reda.

Implementacije reda

[uredi | uredi kôd]

Pomoću vezane liste

[uredi | uredi kôd]

Najfleksibilnija implementacija reda je ona s vezanom listom. Uz samu listu, za realizaciju je potrebna struktura koja će sadržavati pokazivače na početak i kraj reda, i tako omogućiti jednostavnu izvedbu operacija za rad s redom. EnQueue se izvodi tako da se pokazivač zadnjeg elementa usmjeri na novostvoreni element, te se nakon toga pokazivač na kraj liste usmjerava na taj isti element. DeQueue se izvodi tako da se pokazivač na početak liste (glavu) preusmjeri na sljedeći element, a stari se element obriše. Lista je prazna ako oba pokazivača pokazuju na isti element.

Pomoću polja

[uredi | uredi kôd]

Kada govorimo o polju, najčešće se izvodi implementacija kružnog reda, koja je spomenuta kasnije u tekstu.

Primjene reda

[uredi | uredi kôd]

Red svoju primjenu nalazi u računarstvu gdje služi kao međuspremnik i transportu gdje stvari poput podataka, objekata, ljudi ili događaja bivaju zadržani čekajući na obradu.

Modifikacije reda

[uredi | uredi kôd]
Ograničeni red (ograničen je izlaz) s dva kraja

Red s dva kraja

[uredi | uredi kôd]

Red s dva kraja (engl. double-ended queue tj. deque) posebna je vrsta reda kojem se elementi mogu dodavati/čitati i s čela i sa začelja. Postoje tri vrste ovakvog reda:

  • Deque s čitanjem i pisanjem na oba kraja - obje operacije su podržane i na čelu i na začelju
  • Deque s ograničenim ulazom - na jednoj strani moguće su obje operacije, a na drugoj samo uklanjanje.
  • Deque s ograničenim izlazom - na jednoj strani moguće obje operacije, a na drugoj samo umetanje.

Kružni red

[uredi | uredi kôd]
Slikovit prikaz kružnog reda. U stvarnosti memorija nije cirkularna (vidi lijevu sliku)

Kružni red (kružni međuspremnik) koristi listu elemenata fiksne veličine, čiji su krajevi povezani. Koristi se kao međuspremnik. Može se implementirati pomoću polja, a potrebna su još i tri pokazivača; jedan koji pokazuje na samu memorijsku lokaciju međuspremnika, jedan koji pokazuje početak elemenata koji sadrže podatke, i treći koji pokazuje kraj elemenata.

Kružni red je pun ako pokazivač početka podataka, kao i pokazivač kraja pokazuju na isti element. Pošto je situacija identična kada je red prazan, potrebno je uvesti još jedan indikator ili sl. Detalji rješavanja ovog problema neće biti ovdje navedeni.

Red s prioritetima

[uredi | uredi kôd]

Red s prioritetima je takav red koji podržava sljedeće tri funkcije: InsertWithPriority koji dodaje element s određenim prioritetom, GetNext koji vraća element s najvećim prioritetom i miče ga iz reda i (opcijski) PeekAtNext koji vraća element s najvećim prioritetom i ostavlja ga u redu.