From: Doni Pracner Date: Sat, 16 May 2015 17:02:11 +0000 (+0200) Subject: Klase Stek i Red, verzije 1.0.0 X-Git-Url: http://svarog.pmf.uns.ac.rs/gitweb/?p=spa1-materijali.git;a=commitdiff_plain;h=b962197f9c8f6028b9f01630e9f6fa1170da73bd Klase Stek i Red, verzije 1.0.0 --- diff --git a/kodovi/stek-i-red-opsluzivanja/Red.java b/kodovi/stek-i-red-opsluzivanja/Red.java new file mode 100644 index 0000000..37f63ca --- /dev/null +++ b/kodovi/stek-i-red-opsluzivanja/Red.java @@ -0,0 +1,174 @@ +/** + * Tip podataka red opsluživanja, koji omogućava skladištenje podataka u skladu + * sa principom "prvi unutra, prvi napolje". + * + *

+ * Ova klasa koristi niz za skladištenje podataka, te je samim tim ograničena i + * moguće je da metod za dodavanje elemenata baci izuzetak u slučaju da više + * nema mesta. + *

+ * + * @version v1.0.0 + * + * @param + * Tip podataka koji će se čuvati u konkretnoj instanci reda + * opsluživanja. + */ +public class Red { + /** + * Separator vrednosti u {@code toString} metodu: {@value} . + */ + public static final String SEPARATOR = ", "; + + private int prvi, poslednji; + private T[] elementi; + + /** + * Veličina redova za koje nije prosleđen parametar o veličini. Konkretna + * vrednost je {@value} . + */ + public static final int PODRAZUMEVANA_VELICINA = 100; + + /** + * Kreira novi red opsluživanja podrazumevane veličine + * {@value #PODRAZUMEVANA_VELICINA}. + */ + public Red() { + this(PODRAZUMEVANA_VELICINA); + } + + /** + * Kreira novi red opsluživanja zadate veličine. + * + * @param n + * broj elemenata koji red opsluživanja može maksimalno da primi. + */ + // poželjno koristiti Suppress da kompajliranje ne prijavljuje upozorenja + @SuppressWarnings("unchecked") + public Red(int n) { + prvi = -1; + poslednji = -1; + elementi = (T[]) (new Object[n]); + } + + /** + * Pomoćni metod za zadržavanje indeksa niza u opsegu. Metod uvek vraća + * indeks sledećeg elementa u odnosu na onaj koji je prosleđen. Sledeći + * element je za jedno mesto više od trenutnog, osim za poslednji kome je + * sledeći prvi. + * + * @param i + * indeks elementa za koji se traži sledeći + * @return indeks elementa koji je posle onog koji je prosleđen. + */ + private int dodajJedan(int i) { + return (i + 1) % elementi.length; + } + + /** + * Vraća da li je red prazan. + * + * @return da li je red prazan + */ + public boolean jePrazan() { + return poslednji == -1; + } + + /** + * Vraća da li je red pun. + * + * @return da li je red pun + */ + public boolean jePun() { + return dodajJedan(poslednji) == prvi; + } + + /** + * Vraća vrednost elementa na početku reda opsluživanja. Ukoliko je red + * prazan baca se izuzetak. + * + * @return vrednost elementa na početku reda opsluživanja + */ + public T prvi() { + if (jePrazan()) + throw new IllegalStateException("Red je prazan"); + else + return elementi[prvi]; + } + + /** + * Izbacuje element sa početka reda opsluživanja i vraća ga. Ukoliko je red + * prazan baca se izuzetak. + * + * @return vrednost elementa koji je bio na početku reda opsluživanja + */ + public T izbaciPrvi() { + if (jePrazan()) { + throw new IllegalStateException("Red je prazan"); + } else { + T el = elementi[prvi]; + if (prvi == poslednji) { + prvi = -1; + poslednji = -1; + } else + prvi = dodajJedan(prvi); + return el; + } + } + + /** + * Ubacuje prosleđeni element na kraj reda opsluživanja. Ukoliko je red već + * pun baca se izuzetak. + * + * @param x + * element koji će biti ubačen na kraj reda + */ + public void naKraj(T x) { + if (jePun()) + throw new IllegalStateException("Red je pun"); + else { + if (jePrazan()) { + prvi = 0; + poslednji = 0; + } else + poslednji = dodajJedan(poslednji); + elementi[poslednji] = x; + } + } + + /** + * Vraća String reprezentaciju ovog Reda. Reprezentacija će sadržati + * najviše 4 elementa iz reda, tačnije najviše prva dva i poslednja dva, + * razdvojenih sa {@value #SEPARATOR}, a ukoliko ima više od 4 elementa biće + * dodato i "..." između prvih i poslednjih elemenata. + */ + public String toString() { + String rez = "Red:"; + + if (jePrazan()) { + rez += "prazan"; + } else { + rez += elementi[prvi]; + if (prvi != poslednji) { + int drugi = dodajJedan(prvi); + rez += SEPARATOR + elementi[drugi]; + if (drugi != poslednji) { + + int predposlednji = poslednji - 1; + if (poslednji == 0) { + predposlednji = elementi.length - 1; + } + + if (predposlednji != drugi) { + if (dodajJedan(drugi) != predposlednji) { + rez += SEPARATOR + "..."; + } + rez += SEPARATOR + elementi[predposlednji]; + } + rez += SEPARATOR + elementi[poslednji]; + } + } + } + return rez; + } +} \ No newline at end of file diff --git a/kodovi/stek-i-red-opsluzivanja/Stek.java b/kodovi/stek-i-red-opsluzivanja/Stek.java new file mode 100644 index 0000000..a3e07c9 --- /dev/null +++ b/kodovi/stek-i-red-opsluzivanja/Stek.java @@ -0,0 +1,143 @@ +/** + * Tip podataka stek, koji omogućava skladištenje podataka u skladu sa principom + * "poslednji unutra, prvi napolje". + * + *

+ * Implementacija koristi niz, te je u skladu sa tim ograničena veličina steka + * koji se koristi i moguće je da će operacija za dodavanje elemenata baciti + * izuzetak ukoliko nema mesta. + *

+ * + * @version v1.0.0 + * + * @param + * Tip podataka koji će se čuvati u konkretnoj instanci steka. + */ +public class Stek { + /** + * Separator vrednosti u {@code toString} metodu: {@value} . + */ + public static final String SEPARATOR = ", "; + + // indeks prvog slobodnog elementa na steku + private int popunjeno; + + // niz u kome se skladiste elementi + private T[] elementi; + + /** + * Veličina stekova za koje nije prosledjen parametar o veličini ({@value} + * ). + */ + public static final int PODRAZUMEVANA_VELICINA = 100; + + /** + * Kreira novi Stek podrazumevane veličine {@value #PODRAZUMEVANA_VELICINA}. + */ + public Stek() { + this(PODRAZUMEVANA_VELICINA); + } + + /** + * Kreira nov Stek zadate velicine. + * + * @param n + * maksimalan broj elemenata koji će ovaj stek moći da primi. + */ + // pozeljno koristiti Suppress da kompajliranje ne prijavljuje upozorenja + @SuppressWarnings("unchecked") + public Stek(int n) { + popunjeno = 0; + elementi = (T[]) (new Object[n]); + } + + /** + * Vraća da li je stek prazan. + * + * @return da li je stek prazan + */ + public boolean jePrazan() { + return popunjeno == 0; + } + + /** + * Vraća da li je stek pun. + * + * @return da li je stek pun + */ + public boolean jePun() { + return popunjeno == elementi.length; + } + + /** + * Vraća vrednost elementa na vrhu steka. Ukoliko je stek prazan baca + * izuzetak. + * + * @return vrednost elementa na vrhu steka + */ + public T vrh() { + if (jePrazan()) { + throw new IllegalStateException("Stek je prazan"); + } else + return elementi[popunjeno - 1]; + } + + /** + * Skida element sa vrha steka i vraća ga. Ukoliko je stek prazan baca se + * izuzetak. + * + * @return vrednost elementa koji je bio na vrhu steka + */ + public T skiniVrh() { + if (jePrazan()) { + throw new IllegalStateException("Stek je prazan"); + } else + popunjeno--; + return elementi[popunjeno]; + } + + /** + * Ubacuje prosleđeni element na vrh steka. Ukoliko je stek već pun baca se + * izuzetak. + * + * @param x + * element koji će biti ubačen na vrh steka + */ + public void stavi(T x) { + if (jePun()) { + throw new IllegalStateException("Stek je pun"); + } else { + elementi[popunjeno] = x; + popunjeno++; + } + } + + /** + * Vraća String reprezentaciju ovog Steka. Reprezentacija će sadržati + * najviše 4 elementa sa steka, tačnije najviše prva dva i poslednja dva, + * razdvojenih sa {@value #SEPARATOR}, a ukoliko ima više od 4 elementa biće + * dodato i "..." između prvih i poslednjih elemenata. + */ + public String toString() { + String rez = "Stek: "; + if (jePrazan()) { + rez += "prazan"; + } else { + rez += elementi[popunjeno - 1]; + if (popunjeno > 1) { + int sledeci = popunjeno - 2; + rez += SEPARATOR + elementi[sledeci]; + if (popunjeno > 2) { + if (popunjeno > 4) { + rez += SEPARATOR + "..."; + } + if (popunjeno > 3) { + rez += SEPARATOR + elementi[1]; + } + rez += SEPARATOR + elementi[0]; + } + } + } + return rez; + } +} \ No newline at end of file