}w!"#$%&'()+,-./012345<ya



Podobné dokumenty
Algoritmizace prostorových úloh

Základní datové struktury

Datové struktury. alg12 1

Algoritmizace prostorových úloh

Da D to t v o é v ty t py IB111: Datové typy

Abstraktní datové typy: zásobník

Stromy. Příklady. Rekurzivní datové struktury. Základní pojmy

Dynamické datové struktury I.

Reprezentace aritmetického výrazu - binární strom reprezentující aritmetický výraz

Datové struktury. Obsah přednášky: Definice pojmů. Abstraktní datové typy a jejich implementace. Algoritmizace (Y36ALG), Šumperk - 12.

ADT/ADS = abstraktní datové typy / struktury

Lineární datové struktury

Konstruktory a destruktory

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Úvod do programovacích jazyků (Java)

Virtuální počítač. Uživatelský program Překladač programovacího jazyka Operační systém Interpret makroinstrukcí Procesor. PGS K.

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

součet cvičení celkem. známka. Úloha č.: max. bodů: skut. bodů:

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Datové typy a struktury

ZÁPOČTOVÁ PRÁCE z UIR

V případě jazyka Java bychom abstraktní datový typ Time reprezentující čas mohli definovat pomocí třídy takto:

5 Přehled operátorů, příkazy, přetypování

8 Třídy, objekty, metody, předávání argumentů metod

TÉMATICKÝ OKRUH Softwarové inženýrství

Úvod do programovacích jazyků (Java)

Semestrální práce 2 znakový strom

Algoritmizace a programování

Algoritmizace a programování

Masarykova střední škola zemědělská a Vyšší odborná škola, Opava, příspěvková organizace

Programování v C++ 2, 4. cvičení

Java - Kresba. 2/28/11 1/8 Java - kresba

1. Dědičnost a polymorfismus

Šablony, kontejnery a iterátory

Při studiu tohoto bloku se předpokládá, že student je zvládá základy programování v jazyce Java s využitím vývojového prostředí NetBeans.

Dynamické datové struktury IV.

Předměty. Algoritmizace a programování Seminář z programování. Verze pro akademický rok 2012/2013. Verze pro akademický rok 2012/2013

Teoretické minimum z PJV

Tematický celek Proměnné. Proměnné slouží k dočasnému uchovávání hodnot během provádění aplikace Deklarace proměnných

Postupy práce se šablonami IS MPP

Paměť počítače. alg2 1

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

Středoškolská technika SCI-Lab

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

2 Grafický výstup s využitím knihovny

ABSTRAKTNÍ DATOVÉ TYPY (ADT)

Úvod do programování - Java. Cvičení č.4

5 Rekurze a zásobník. Rekurzivní volání metody

Překladač a jeho struktura

ALGORITMIZACE A PROGRAMOVÁNÍ

Programovací jazyk Pascal

Algoritmy a datové struktury

VISUAL BASIC. Přehled témat

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

Maturitní témata. IKT, školní rok 2017/18. 1 Struktura osobního počítače. 2 Operační systém. 3 Uživatelský software.

Programátorská příručka

Abstraktní datové typy

1. Převeďte dané číslo do dvojkové, osmičkové a šestnáctkové soustavy: a) b)

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

1. Programování proti rozhraní

Programování v C++, 2. cvičení

Kolekce, cyklus foreach

Jak v Javě primitivní datové typy a jejich reprezentace. BD6B36PJV 002 Fakulta elektrotechnická České vysoké učení technické

Výčtový typ strana 67

Java aplety. Předávání parametrů z HTML

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Algoritmizace. Cíle předmětu

Pravidla a plánování

Software602 Form Designer

Maturitní otázky z předmětu PROGRAMOVÁNÍ

Programovací jazyk Java

Java a XML. 10/26/09 1/7 Java a XML

Lineární datové struktury

1 Nejkratší cesta grafem

KAPITOLA 9 - POKROČILÁ PRÁCE S TABULKOVÝM PROCESOREM

1 Webový server, instalace PHP a MySQL 13

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

Obsah přednášky. programovacího jazyka. Motivace. Princip denotační sémantiky Sémantické funkce Výrazy Příkazy Vstup a výstup Kontinuace Program

PŘÍRUČKA PRÁCE SE SYSTÉMEM SLMS CLASS pro učitele

ELEKTRONICKÉ PODÁNÍ OBČANA

Programování v C++ 3, 3. cvičení

PŘETĚŽOVÁNÍ OPERÁTORŮ

PHP tutoriál (základy PHP snadno a rychle)

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Vývojové prostředí,průvodce novou aplikací

Operátory, výrazy. Tomáš Pitner, upravil Marek Šabo

Programování v C++ 1, 5. cvičení

Student s Life. Návrhová dokumentace (Design) Lukáš Barák, Jakub Ječmínek, Jaroslav Brchel, Jiří Zmeškal

Programovací jazyky. imperativní (procedurální) neimperativní (neprocedurální) assembler (jazyk symbolických instrukcí)

Projekt Obrázek strana 135

Semestrální práce z KIV/PC. Kolja Matuševský (A14B0310P)

Reliance 3 design OBSAH

OSTRAVSKÁ UNIVERSITA V OSTRAVĚ Pedagogická fakulta Obor informační technologie ve vzdělávání Kombinované studium

1 Uživatelská dokumentace

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Maturitní témata Školní rok: 2015/2016

Transkript:

}w!"#$%&'()+,-./012345<ya MASARYKOVA UNIVERSITA FAKULTA INFORMATIKY Vizualizace základních abstraktních datových typů BAKALÁŘSKÁ PRÁCE Martin Herodes Brno, jaro 2002

Prohlášení Prohlašuji, že tato bakalářská práce je mým původním autorským dílem, které jsem vypracoval samostatně. Všechny zdroje, prameny a literaturu, které jsem při vypracování používal nebo z nich čerpal, v práci řádně cituji s uvedením úplného odkazu na příslušný zdroj. ii

Shrnutí Cílem projektu bylo vytvořit program, který by ilustroval práci a použití základních abstraktních datových typů - spojového seznamu, zásobníku, fronty a binárního stromu. Projekt byl rozdělen mezi čtyři studenty následovně: Spojový seznam - Pavel Drášil, xdrasil@fi.muni.cz Binární strom - Tomáš Udržal, xudrzal@fi.muni.cz Zásobník - Martin Herodes, xherodes@fi.muni.cz Fronta - Jiří Winkler, xwinkle1@fi.muni.cz Realizován byl jako aplet v programovacím jazyku Java zejména pro možnost spuštění v internetovém prohlížeči. Použito bylo grafické uživatelské prostředí JFC Swing 1. 1 Java Foundation Classes Swing iii

Klíčová slova JAVA, abstraktní datový typ, zásobník, fronta, spojový seznam, binární strom iv

Obsah 1 Zadání................................................ 3 2 Abstraktní datové typy...................................... 4 2.1 Zásobník............................................ 4 2.2 Fronta.............................................. 5 2.3 Spojový seznam........................................ 5 2.4 Binární strom......................................... 5 3 Použitý software.......................................... 6 3.1 Programovací jazyk Java................................... 6 3.2 Výběr grafického uživatelského prostředí......................... 6 4 Řešení projektu........................................... 7 4.1 Popis programu........................................ 7 4.1.1 Výběr datového typu................................. 7 4.1.2 Vizualizace zásobníku................................ 7 4.1.3 Vyhodnocování aritmetických výrazů....................... 9 4.1.4 O zásobníku...................................... 10 4.2 Použité algoritmy....................................... 10 4.2.1 Převod infixu na postfix............................... 10 4.2.2 Převod postfixu na výsledek............................ 11 4.2.3 Převod infixu na výsledek.............................. 11 5 Závěr................................................. 13 A Dokumentace............................................ 15 1

Seznam obrázků 4.1 Výběr datového typu..................................... 7 4.2 Vizualizace zásobníku.................................... 8 4.3 Vyhodnocování aritmetických výrazů........................... 10 4.4 Okno s informacemi o zásobníku.............................. 11 2

Kapitola 1 Zadání Naprogramovat v jazyce Java jednak třídu s metodami pro visualisaci elementů použitelných pro ilustraci práce a použití spojových seznamů, zásobníků, front a binárních stromů a jednak samotnou ilustraci práce a použití spojových seznamů, zásobníků, front a binárních stromů. Předpokládá se spolupráce čtyř studentů, kteří by se podělili o práci v prvním bodě a každý by si vzal jeden z bodů následujících. Vedoucí projektu: RNDr. Aleš Zlámal, zlamal@fi.muni.cz 3

Kapitola 2 Abstraktní datové typy V matematice je obvyklé klasifikovat proměnné podle určitých význačných vlastností. Důkladně se odlišují reálné proměnné od komplexních a logických proměnných. Podobný způsob klasifikace je stejně důležitý při zpracování dat v programu. Každá proměnná, konstanta, výraz nebo funkce jsou jistého typu. Tento typ určuje množinu hodnot, do které daná konstanta patří, nebo kterou může nabývat výraz nebo funkce. Zajímají nás tedy pouze význačné vlastnosti zpracovávaných dat. Tomuto principu zjednodušení se říká abstrakce. U datových abstrakcí se využívá oddělení informací, které nás zajímají od vnitřní reprezentace dat. Pro uživatele typu představuje datová abstrakce černou skříňku, jejíž vnější efekty zná, ale vnitřek zůstává skryt. Abstraktní datový typ je datový typ reprezentující množinu datových objektů a množinu operací, které se nad těmito objekty mohou provádět. Přitom je potlačeno hledisko, jak jsou data uložena, a jak se nad nimi provádějí operace. Je zdůrazněno, co data reprezentují a co s nimi operace provádějí. Mezi základní abstraktní datové typy patří zásobník, fronta, spojový seznam a binární strom. Tyto budou v dalších podkapitolách podrobněji popsány. Existují však další jako například graf, tabulka, různé druhy stromů,... 2.1 Zásobník Zásobník je datová struktura, která umožňuje uchovávat posloupnost proměnného počtu prvků téhož typu. Přístup k prvkům této posloupnosti je možný jen z jednoho jejího konce, tzv. vrcholu zásobníku. Spočívá v uložení prvku na vrchol zásobníku a odebrání prvku z vrcholu zásobníku. Proto bývá zásobník nazýván seznamem typu LIFO (last in first out). Kromě přidávání a odebírání prvků se používá nahlédnutí na vrchol bez odebrání, test na prázdnost a vyprázdnění. Vlastnosti zásobníku jsou velmi podobné řadě objektů, které mají v praktickém životě stejné jméno. Zásobník lze implementovat např. pomocí dynamických proměnných nebo použitím pole. Zásobník nachází široké uplatnění v programovacích technikách a určuje podstatu řady významných algoritmů. Na úrovni hardwaru se používá pro ukládání instrukcí procesoru. V programovacích jazycích je pomocí zásobníku implementováno předávání parametrů u funkcí. V programech je často výhodné použití zásobníku. Například program, který má ze vstupního souboru přečíst posloupnost znaků a vytisknout je v obráceném pořadí. Realizace takového programu je jednoduchá - jen opakovaně provádíme uložení znaků do zásobníku a následně odebrání znaků ze zásobníku. Dalším příkladem využití zásobníku může být převod aritmetického výrazu do postfixu a následné vyhodnocení, nebo přímo vyhodnocení aritmetického výrazu v infixovém tvaru. Tyto techniky jsou podrobně popsány v kapitole Oddíl 4.2. 4

2.2. FRONTA 2.2 Fronta Fronta je datová struktura, která umožňuje uchovávat posloupnost prvků téhož typu. Může z ní být odebrán pouze ten prvek, který do ní byl uložen jako první, tj. je v čele fronty. Nový prvek se do fronty ukládá za ten prvek, který do ní byl uložen jako poslední - na konec fronty. Proto bývá fronta nazývána seznamem typu FIFO (first in first out) aneb kdo dřív přijde, ten dřív mele. Kromě přidávání a odebírání prvků se používá nahlédnutí na čelo fronty bez odebrání, test na prázdnost a vyprázdnění. Na rozdíl od zásobníku, který manipuluje s prvky pouze na jednom konci, fronta umožňuje manipulaci s prvky na obou jejích koncích. Frontu lze implementovat např. pomocí dvou zásobníků nebo použitím cyklického pole. Fronta nachází uplatnění především v úlohách z oblasti hromadné obsluhy, do kterých spadají i některé problémy, které jsou součástí operačních systémů. 2.3 Spojový seznam Spojový seznam je datová struktura umožňující uchovávat posloupnost proměnného počtu prvků téhož typu. Zásobník a fronta jsou jeho speciální případy. Základní operace prováděné nad datovou strukturou jsou uložení prvku do seznamu a odebrání prvku ze seznamu. Tyto operace je možné aplikovat v kterémkoli místě seznamu. Často definujeme složitější operace (zpřístupnění n-tého prvku, rozdělení seznamu na dva, spojení dvou seznamů,...) a během výpočtu seznamy vytváříme a rušíme. Implementace seznamů se provádí obvykle pomocí dynamických proměnných. Spojový seznam je jednou z nejobecnějších datových struktur používaných zejména v oblasti nenumerického zpracování dat. Druhy seznamů jsou - jednosměrný, obousměrný a kruhový seznam. 2.4 Binární strom Strom je bud prázdný nebo vrchol základního typu spolu s konečným počtem připojených disjunktních stromových struktur základního typu, které nazýváme podstromy. Stromy mají řadu zajímavých vlastností a nalezneme je v mnoha aplikacích. Binární strom je strom, jehož každý uzel má nejvýše dva potomky (levý a pravý). Je nejvhodnějším kandidátem na reprezentaci slov vyskytujících se v textu. Jednou z nejdůležitějších operací nad stromem je procházení vrcholů. Pro průchod stromem můžeme použít různé strategie: preorder - zpracuje vrchol, projde levý podstrom, projde pravý podstrom inorder - projde levý podstrom, zpracuje vrchol, projde pravý podstrom postorder - projde levý podstrom, projde pravý podstrom, zpracuje vrchol 5

Kapitola 3 Použitý software 3.1 Programovací jazyk Java Projekt byl vytvořen v programovacím jazyku Java. Tento objektově orientovaný jazyk, který se syntaxí velmi podobá jazyku C++, je nezávislý na konkrétní platformě. Výsledné programy se tak mohou spouštět v nejrůznějších systémech. To je možné díky tomu, že Java běží na abstraktně definovaném virtuálním stroji (Java VM), který je v cílovém systému emulován. Tomuto prostředí pro spouštění Javy se říká Java Runtime Environment (JRE). Vývojář pracující v Javě vytvoří pouze jeden univerzální zdrojový kód. Ten přeloží do binárního kódu pro Java VM, tzv. bajtkód. Nejedná se však o spustitelný soubor, ale o soubor, který je spuštěn zadáním parametru pro interpret Javy (JRE) pomocí příkazu java název_souboru To byla možnost spuštění programu jako aplikace. Java má však další způsob, a tím jsou aplety. Aplety jsou speciální třídy, které běží na webovém prohlížeči, který podporuje Javu. Tato podpora je již integrována, ale v Netscape Navigatoru či Internet Exploreru se může pomocí zásuvného modulu Javy od Sunu nahradit aktuální verzí. Aplety jsou do webových stránek vkládány pomocí speciální instrukce jazyka HTML a uloženy většinou na webovém serveru. Mohou komunikovat s prohlížečem a případně i s webem, kde jsou uloženy. Bezpečnostní omezení v apletech by měla zajistit, aby neznámý kód nahraný webovým serverem nemohl poškodit či špehovat systém. 3.2 Výběr grafického uživatelského prostředí Zejména kvůli možnosti spuštění v internetovém prohlížeči byl projekt vytvořen jako aplet. Bylo nutné si vybrat ze dvou grafických uživatelských rozhraní, které Java nabízí - Awt nebo Swing. Obě mají své výhody a nevýhody. Starší a jednodušší AWT nechává vykreslování komponent na operačním systému. Je tedy rychlejší, ale výsledný program má jiný vzhled v různých operačních systémech. Naproti tomu Swing, který je v podstatě rozšířením AWT, je pomalejší, protože si sám vykresluje komponenty. Programy mají ve všech operačních systémech stejný vzhled, a tedy odpadá testování na jiných systémech. Největší nevýhodou Swingu je ovšem malá podpora v internetových prohlížečích. Podporován je v podstatě jen na těch nejnovějších a to znamená, že uživatelé některých prohlížečů budou nuceni doinstalovat plug-iny, protože jinak aplet nespustí. V budoucnosti bude ale pravděpodobně výhradně používáno grafické rozhraní Swing, a proto bylo použito na realizaci projektu. 6

Kapitola 4 Řešení projektu 4.1 Popis programu 4.1.1 Výběr datového typu Po spuštění programu z internetového prohlížeče se objeví základní aplet Výběr datového typu (obr. 4.1): Obrázek 4.1: Výběr datového typu Zde si může uživatel vybrat z nabízených možností a po provedení tlačítka Spustit se provede otevření formuláře s vybraným abstraktním datovým typem. Po jeho případném ukončení je možno z apletu znovu spustit některý z abstraktních datových typů. Uzavřením okna se základním apletem se program ukončí. 4.1.2 Vizualizace zásobníku Po spuštění formuláře se zásobníkem se uživatel dostane do režimu Vizualizace zásobníku (obr. 4.2) a má následující možnosti: Vybere z menu položku Spustit : 7

Zásobník neprovede se nic, protože uživatel má zásobník již spuštěný 4.1. POPIS PROGRAMU Fronta ukončení formuláře se zásobníkem a otevření nového formuláře s frontou Spojový seznam ukončení formuláře se zásobníkem a otevření nového formuláře se spojovým seznamem Binární strom ukončení formuláře se zásobníkem a otevření nového formuláře s binárním stromem Konec ukončení formuláře se zásobníkem Vybere z menu položku Možnosti : Vizualizace zásobníku neprovede se nic, protože uživatel má vizualizaci zásobníku právě spuštěnou Vyhodnocování aritmetických výrazů přepnutí do režimu vyhodnocování aritmetických výrazů Vybere z menu položku Nápověda : O zásobníku otevření okna s nápovědou o zásobníku Provede nějakou akci na panelu: Přidat přidání prvku do zásobníku Odebrat odebrání prvku ze zásobníku Vyprázdnit vyprázdnění zásobníku Vrchol vypíše prvek, který je na vrcholu zásobníku Animace zaškrtnutí znamená, že se při přidání a odebrání bude prvek animovat Zadávání prvků zaškrtnutí znamená, že se do zásobníku budou přidávat prvky, které zadá uživatel Obrázek 4.2: Vizualizace zásobníku 8

4.1. POPIS PROGRAMU 4.1.3 Vyhodnocování aritmetických výrazů Po přepnutí do režimu Vyhodnocování aritmetických výrazů (obr. 4.3) má uživatel následující možnosti: Vybere z menu položku Spustit : Zásobník neprovede se nic, protože uživatel má zásobník již spuštěný Fronta ukončení formuláře se zásobníkem a otevření nového formuláře s frontou Spojový seznam ukončení formuláře se zásobníkem a otevření nového formuláře se spojovým seznamem Binární strom ukončení formuláře se zásobníkem a otevření nového formuláře s binárním stromem Konec ukončení formuláře se zásobníkem Vybere z menu položku Možnosti : Vizualizace zásobníku přepnutí do režimu vizualizace zásobníku Vyhodnocování aritmetických výrazů neprovede se nic, protože uživatel má vyhodnocování aritmetických výrazů právě spuštěné Vybere z menu položku Nápověda : O zásobníku otevření okna s nápovědou o zásobníku Vybere z možností převedení nebo zobrazení na panelu: Infix na postfix nastavení převodu z infixu na postfix, které se spustí po stisknutí tlačítka Spustit Postfix na výsledek nastavení převodu z postfixu na výsledek, které se spustí po stisknutí tlačítka Spustit Infix na výsledek nastavení převodu z infixu na výsledek, které se spustí po stisknutí tlačítka Spustit Postup nastavení zobrazení výsledku s postupem Jen výsledek nastavení zobrazení výsledku bez postupu Provede nějakou akci na panelu: Spustit nebo Zastavit pokud je spuštěný převod, tak ho zastaví a pokud není tak ho spustí Jeden krok provede jeden krok převodu Dokonči dokončí převod výrazu Animace po zaškrtnutí se bude prvek při přidávání a odebírání ze zásobníku animovat Zadá aritmetický výraz nebo vybere z nabízených možností. 9

4.2. POUŽITÉ ALGORITMY Obrázek 4.3: Vyhodnocování aritmetických výrazů 4.1.4 O zásobníku Po vybrání položky O zásobníku z menu se zobrazí okno s informacemi o zásobníku (obr. 4.4). 4.2 Použité algoritmy Jako ukázku použití zásobníku jsem ve třídě Zásobník vytvořil funkce pro práci s aritmetickými výrazy. Použil jsem tři algoritmy - převod infixu na postfix, postfixu na výsledek a infixu na výsledek. Vzhledem k tomu, že jsem od programu požadoval, aby mohl uživatel provádět převod po jednotlivých krocích a dokonce s animací, musel jsem vytvořit takové funkce, které by prováděly vždy jen jeden krok výpočtu. To se mi podařilo díky příkazu return, kterým jsem funkce přerušoval. Nyní uvedu algoritmy, které jsem použil při vyhodnocování aritmetických výrazů. 4.2.1 Převod infixu na postfix IN - vstupní řetězec v infixu, OUT - výstupní řetězec v postfixu, ST - zásobník pro odkládání operátorů a závorek, Na vstupu IN je: číslo X, pak jde na OUT operátor @, pak v ST není ještě žádný operátor, pak operátor @ jde do zásobníku ST v ST je na vrcholu operátor #, pak if priorita(#)>=priorita(@), pak # jde na OUT, @ jde do ST if priorita(#)< priorita(@), pak @ jde do ST levá závorka, pak ( jde do ST (vytváří tzv. logické dno) pravá závorka, pak vyhazuje z ST operátory na OUT, dokud nenarazí na první logické dno (levou závorku, tu zruší) nic, pak vyprázdní ST (přesune všechny operátory z ST na OUT) 10

4.2. POUŽITÉ ALGORITMY Obrázek 4.4: Okno s informacemi o zásobníku 4.2.2 Převod postfixu na výsledek algoritmus nastav se na začátek řetězce; repeat čti prvek; case prvek of číslo x: zapiš x do zásobníku Z; operátor @: vyjmi ze zásobníku tolik operandů, jaká je arita operátoru @; proved příslušnou matematickou operaci pro @; její výsledek ulož do Z; end; until na vstupu je prázdný řetězec; výsledek:=hodnota, která zůstala v zásobníku (jediná) poznámky položka v zásobníku Z musí být typu real (kvůli dělení) ošetření chyb (syntakticky nesprávně zapsané výrazy v infixové notaci) 4.2.3 Převod infixu na výsledek Následující algoritmus využívá dva pomocné zásobníky. Jeden operátorový (pro odkládání operátorů a závorek) a druhý hodnotový (jen pro odkládání čísel). 11

Základem jeho rozhodnutí v každém kroku je to, co se načetlo ze vstupu (1): Číslo je vždy bez jakékoliv další akce uloženo do zásobníku hodnot (3). 4.2. POUŽITÉ ALGORITMY Operátor putuje do zásobníku operátorů (2), kde může dojít k těmto situacím: V případě, že je zásobník prázdný, tak operátor prostě uložíme. Pokud zásobník není prázdný, postupně z něj vybíráme a vyhodnocujeme všechny operátory, které mají vyšší a stejnou prioritu jako operátor načtený ze vstupu, jenž následně do zásobníku uložíme. Vyhodnocování operátorů ze zásobníku končí když: vyprázdníme operátorový zásobník nebo narazíme na levou závorku (ta hraje dočasně roli dna zásobníku a zde ji ještě neodstraňujeme) narazíme na uložený operátor (ten také z operátorového zásobníku neodstraňujeme ani nevyhodnocujeme), který má nižší prioritu jako vstupující operátor Levá závorka je vždy bez jakékoliv další akce uložena do operátorového zásobníku (2). Pravá závorka značí, že je nutno vyhodit všechny operátory z operátorového zásobníku až do prvního výskytu uložené levé závorky, kterou je potřeba odstranit. Vyprázdní-li se během tohoto vyhodnocování operátorový zásobník (bez vybrání levé závorky), potom je ve vstupním výrazu chyba (chybí levá závorka). Konec výrazu znamená, že je třeba dovyhodnotit všechny operátory z operátorového zásobníku a z hodnotového zásobníku si vyzvednout výsledek celého výrazu (4). Poté by měl být zásobník hodnot prázdný, jinak byla ve vstupním výrazu chyba. Objeví-li se během dovyhodnocování operátorů v operátorovém zásobníku levá závorka, je to, jak jinak, chyba ve vstupním výrazu (chybí pravá závorka). Zbývá upřesnit, co znamená vyhodnotit operátor z operátorového zásobníku : spočívá to ve vyzvednutí příslušného počtu operandů ze zásobníku hodnot (kolik - arita operátoru), provedení operace určené operátorem (např. -, pozor na obrácené pořadí operandů u nekomutativních operací) a uložení výsledku do zásobníku hodnot. 12

Kapitola 5 Závěr V rámci projektu jsem vytvořil abstraktní datový typ Zásobník, který je součástí balíčku ADT. V tomto balíčku jsou čtyři základní abstraktní datové typy - Zásobník, Fronta, Spojový seznam a Binární strom. Jsou vytvořeny kompletně objektově, proto je lze snadno využít. Zásobník umí navíc pracovat s aritmetickými výrazy - vyhodnocovat je a převádět do postfixu. Výsledný program (aplet) je pak určen k porozumění základním abstraktním datovým typům. Přehlednou formou a pomocí animace ukazuje, jak fungují základní operace nad těmito typy. Jako ukázku použití zásobníku jsem zvolil vyhodnocování aritmetických výrazů. Program umožňuje vyhodnocení aritmetických výrazů po jednotlivých krocích a pomocí animace. Dá se tedy dobře pochopit celý princip převodu. 13

Literatura [Hawlitzek] [Herout] [Sedláček] [Skřivan] [Snášel] [Škarvada] [Wirth] JAVA 2 příručka programátora, Florian Hawlitzek, 2002, Grada publishing, Praha. JAVA grafické uživatelské prostředí a čeština, Pavel Herout, 2001, nakladatelství KOPP České Budějovice. Poznámky k semináři z Návrhu algoritmů, Martin Sedláček, 2000, FI MU Brno. I065 - Seminář z Návrhu algoritmů, Jaromír Skřivan, 2000, FI MU Brno. Datové struktury, Václav Snášel, 1991, rektorát Univerzity Palackého Olomouc. I002 - Návrhu algoritmů, Libor Škarvada, 2000, FI MU Brno. Algoritmy a štruktúry údajov, Niklaus Wirth, 1989, vydavatel stvo technickej a ekonomickej literatury ALFA Bratislava. 14

Příloha A Dokumentace V programovacím jazyku JAVA existuje speciální typ komentáře pro generování autorské dokumentace, který rozeznává kompilátor javadoc a převádí jej do formátu HTML. Je to poměrně dobrá možnost tvorby dokumentace, a proto jsem ji také využíval. Vzhledem k obsáhlosti dokumentace uvádím v příloze pouze základní třídy balíčku ADT, které používá formulář pro práci se zásobníkem. 15

package ADT Class Prvek public class Prvek extends JComponent implements Cloneable Title: Prvek Description: Základní grafický element - obdélníček s vepsaným textem. Pro napojení šipek poskytuje metody gettop(), getleft(), getbottom(), getright(). Pohyb prvku po úsečce umožňuje metoda moveto(). Copyright: Copyright (c) 2002 Version: 1.0 Author: Pavel Drášil, Jiří Winkler, Martin Herodes, Tomáš Udržal Field Detail label private String label Text, který označuje tento prvek x private int x X-ová souřadnice levého horního rohu y private int y Y-ová souřadnice levého horního rohu width private int width Šířka obdélníku 16

height private int height Výška obdélníku Constructor Detail Prvek public Prvek(String label, int x, int y, int width, int height) Konstruktor, ve kterém se specifikují všechny parametry prvku label - text, který označuje tento prvek x - X-ová souřadnice levého horního rohu y - Y-ová souřadnice levého horního rohu width - šířka obdélníku height - výška obdélníku Prvek public Prvek(String label, int x, int y, Dimension size) Konstruktor, určený pro použití při práci s větším počtem Prvků stejné velikosti (jako parametr "size" může být opakovaně používán stejný objekt) label - text, který označuje tento prvek x - X-ová souřadnice levého horního rohu y - Y-ová souřadnice levého horního rohu size - objekt, který nastaví šířku a výšku obdélníku Method Detail clone public Object clone() Vrací kopii tohoto prvku 17

getlabel public String getlabel() Vrací text, který označuje tento prvek String název prvku getx public int getx() Vrací X-ovou souřadnici levého horního rohu int X-ová souřadnice gety public int gety() Vrací Y-ovou souřadnici levého horního rohu int Y-ová souřadnice gettop public Point gettop() Vrací souřadnice středu horní strany prvku Point souřadnice getbottom public Point getbottom() Vrací souřadnice středu dolní strany prvku Point souřadnice getleft public Point getleft() Vrací souřadnice středu levé strany prvku Point souřadnice 18

getright public Point getright() Vrací souřadnice středu pravé strany prvku Point souřadnice setlabel public void setlabel(string s) Nastaví text, který označuje tento prvek String - název prvku moveto public void moveto(int newx, int newy) Posune prvek na nové souřadnice newx - nová X-ová souřadnice levého horního rohu newy - nová Y-ová souřadnice levého horního rohu moveto public void moveto(int newx, int newy, long timeout) Posune prvek na nové souřadnice a přitom ho zobrazuje newx - nová X-ová souřadnice levého horního rohu newy - nová Y-ová souřadnice levého horního rohu timeout - rychlost pohybu moverel public void moverel(int dx, int dy) Posun prvku na relativní pozici moverel public void moverel(int dx, int dy, 19

long timeout) Animovaný posun prvku na relativní pozici paintcomponent public void paintcomponent(graphics g) Vykreslí pozadí prvku g - Graphics paintborder public void paintborder(graphics g) Vykreslí rámeček kolem prvku g - Graphics package ADT Class Zasobnik public class Zasobnik extends JComponent Title: Zásobník Description: Třída Zásobník pro práci se zásobníky Copyright: Copyright (c) 2002 Version: 1.0 Author: Martin Herodes 20

Field Detail POSUN public static final int POSUN Konstanta - udává délku o kterou se prvek vychýlí od zásobníku při přidání a odebrání prvku TIMEOUT public static final int TIMEOUT Rychlost animace MAXPOCET public static final int MAXPOCET Konstanta - maximální počet prvků v zásobníku z private Prvek[] z Pole pro ukládání prvků maxpocet private int maxpocet Maximální počet prvků, které se mohou zobrazit - podle výšky zásobníku pocet private int pocet Počet prvků v zásobníku size private Dimension size Rozměr prvků, které se mohou vložit do zásobníku x private int x X-ová souřadnice levého horního rohu 21

y private int y Y-ová souřadnice levého horního rohu width private int width Šířka zásobníku height private int height Výška zásobníku bod_x private int bod_x Pomocný bod, na který se přidává nový prvek - X-ová souřadnice bod_y private int bod_y Pomocný bod, na který se přidává nový prvek - Y-ová souřadnice Constructor Detail Zasobnik public Zasobnik(int x, int y, int maxpocet, Dimension size) Konstruktor, který vytváří na zadaném místě prázdný zásobník, ve kterém lze zobrazit maximálně "maxpocet" prvků o rozměrech "size" x - X-ová souřadnice y - Y-ová souřadnice maxpocet - maximální počet zobrazitelných prvků v zásobníku size - objekt, který specifikuje rozměry prvků 22

Method Detail getpocet public int getpocet() Vrací počet prvků v zásobníku int počet prvků getmaxpocet public int getmaxpocet() Vrací maximální počet prvků, které se mohou zobrazit int maximální počet zobrazitelných prvků getsize public Dimension getsize() Vrací rozměry prvků, které se mohou vložit do zásobníku Dimension objekt s rozměrem prvků getbod_x public int getbod_x() Vrací pomocný bod, na který se přidává nový prvek - X-ová souřadnice int X-ová souřadnice pomocného bodu getbod_y public int getbod_y() Vrací pomocný bod, na který se přidává nový prvek - Y-ová souřadnice int Y-ová souřadnice pomocného bodu isempty public boolean isempty() Zjišťuje, zda je zásobník prázdný boolean jestli je zásobník prázdný 23

Push public void Push(Prvek prvek, boolean vizual) Pridává prvek do zásobníku prvek - prvek přidávaný do zásobníku vizual - boolean jestli má být při přidání použita vizualizace Push public void Push(String label, boolean vizual) Pridává řetězec znaků do zásobníku label - String řetězec znaků přidávaný do zásobníku vizual - boolean jestli má být při přidání použita vizualizace Push public void Push(char znak, boolean vizual) Pridává jeden znak do zásobníku znak - char znak přidávaný do zásobníku vizual - boolean jestli má být při přidání použita vizualizace Push public void Push(int cislo, boolean vizual) Pridává celé číslo do zásobníku cislo - int celé číslo přidávané do zásobníku vizual - boolean jestli má být při přidání použita vizualizace Push public void Push(float cislo, boolean vizual) Pridává reálné číslo do zásobníku cislo - float reálné číslo přidávané do zásobníku vizual - boolean jestli má být při přidání použita vizualizace 24

Pop public void Pop(boolean vizual) Odebírá prvek ze zásobníku vizual - boolean jestli má být při odebrání prvku použita vizualizace Top public String Top() Nahlédnutí na vrchol zásobníku aniž by byl prvek odebrán String název prvku, který je na vrcholu zásobníku setvisible public void setvisible(boolean visible) Skrývá a zobrazuje zásobník i se všemi jeho prvky visible - boolean jestli má zásobník skrýt nebo zobrazit jscrollbar1_adjustmentvaluechanged private void jscrollbar1_adjustmentvaluechanged(adjustmentevent e) Posun scrollbaru zásobníku e - AdjustmentEvent paintcomponent public void paintcomponent(graphics g) Vykreslí pozadí zásobníku g - Graphics paintborder public void paintborder(graphics g) Vykreslí obrys zásobníku g - Graphics 25

Init public void Init() Inicializuje pomocné proměnné v zásobníku isinfix public boolean isinfix(string infix) Otestuje zadaný řetězec, jestli je v infixovém tvaru infix - String řetězec, který testujeme boolean jestli je řetězec v infixovém tvaru ispostfix public boolean ispostfix(string postfix) Otestuje zadaný řetězec, jestli je v postfixovém tvaru postfix - String řetězec, který testujeme boolean jestli je řetězec v postfixovém tvaru Priorita private int Priorita(char ch) Vrátí prioritu zadaného operátoru ch - operator int priorita operatoru Vyhodnoceni private boolean Vyhodnoceni(Zasobnik pom, boolean vizual) Pomocná funkce pro vyhodnocení jednoho operátoru pom - Zasobnik pomocný zásobník na ukládání operátorů vizual - boolean jestli má být při vyhodnocení výrazu použita vizualizace boolean jestli se provedlo vyhodnocení 26

Zkraceni private void Zkraceni(String infix, JTextField vystup, boolean zvys) Pomocná funkce, která zkracuje výstupní řetězec infix - String vstupní řetězec vystup - JTextField komponenta, ve které je výstupní řetězec zvys - boolean jestli se má zkrátit až za dalším znakem frominfixtopostfixstep public boolean frominfixtopostfixstep(string infix, JTextField vystup, boolean vizual) Provedení jednoho kroku výpočtu při převodu aritmetického výrazu do postfixového tvaru pomocí zásobníku infix - String aritmetický výraz v infixovém tvaru vystup - JTextField komponenta, ve které se zobrazí výraz v postfixu vizual - boolean jestli má být při převodu výrazu použita vizualizace boolean jestli se krok provedl frominfixtopostfix public void frominfixtopostfix(string infix, JTextField vystup, boolean vizual) Převod aritmetického výrazu do postfixového tvaru pomocí zásobníku infix - String aritmetický výraz v infixovém tvaru vystup - JTextField komponenta, ve které se zobrazí výraz v postfixu vizual - boolean jestli má být při převodu výrazu použita vizualizace frompostfixtointstep public boolean frompostfixtointstep(string postfix, JTextField vystup, boolean vizual) Provedení jednoho kroku výpočtu při vyhodnocení aritmetického výrazu v postfixovém tvaru pomocí zásobníku postfix - String aritmetický výraz v postfixovém tvaru vystup - JTextField komponenta, ve které se zobrazí výsledek 27

vizual - boolean jestli má být při vyhodnocení výrazu použita vizualizace boolean jestli se krok provedl frompostfixtoint public void frompostfixtoint(string postfix, JTextField vystup, boolean vizual) Vyhodnocení aritmetického výrazu v postfixovém tvaru pomocí zásobníku postfix - String aritmetický výraz v postfixovém tvaru vystup - JTextField komponenta, ve které se zobrazí výsledek vizual - boolean jestli má být při vyhodnocení výrazu použita vizualizace frominfixtointstep public boolean frominfixtointstep(string infix, JTextField vystup, Zasobnik pom, boolean vizual) Provedení jednoho kroku výpočtu při vyhodnocení aritmetického výrazu pomocí zásobníku infix - String aritmetický výraz v infixovém tvaru vystup - JTextField komponenta, ve které se zobrazí výsledek pom - Zasobnik pomocný zásobník na ukládání operátorů vizual - boolean jestli má být při vyhodnocení výrazu použita vizualizace boolean jestli se krok provedl frominfixtoint public void frominfixtoint(string infix, JTextField vystup, Zasobnik pom, boolean vizual) Vyhodnocení aritmetického výrazu pomocí zásobníku infix - String aritmetický výraz v infixovém tvaru vystup - JTextField komponenta, ve které se zobrazí výsledek pom - Zasobnik pomocný zásobník na ukládání operátorů vizual - boolean jestli má být při vyhodnocení výrazu použita vizualizace 28