Föreläsning 3. Stack

Relevanta dokument
Föreläsning 3. Stack

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista Läsanvisningar och uppgifter

ADT Kö. Seminarium 4 Köer och Stackar Innehåll. Operationer. ADT Stack. Definition. Definition

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista

Föreläsning 2. Länkad lista och iterator

Länkade strukturer. (del 2)

Föreläsning 2. Länkad lista och iterator

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

Datastrukturer. föreläsning 3. Stacks 1

Föreläsning 3 Innehåll. Generiska klasser. Icke-generisk lista ArrayList, skiss av implementering. Icke-generisk lista Risk för fel

ADS : STACK ADT: STACK. Stack och Kö -Implementering - Tilllämpningar. Oftast förekommande metoder i Stack. TopOfStack

Tentamen i Algoritmer & Datastrukturer i Java

Föreläsning 1. Abstrakta datatyper, listor och effektivitet

Datastrukturer. Arrayer. Arrayer. Arrayer. Array av arrayer. Array av arrayer

Föreläsning 7. Träd och binära sökträd

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Länkade listor Stackar Köer MyList Iteratorer Lab 2 Exceptions Paket

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Abstrakt datatyp. -Algoritmer och Datastrukturer- För utveckling av verksamhet, produkter och livskvalitet.

Föreläsning 4 Innehåll

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

Stack, specifikation. Stack och Kö. Y s t M A p. Stack. <== > Y s t M A p <== > Prioritetskö

Generisk klass med typparameter Inre klass - ListIterator

Länkade strukturer, parametriserade typer och undantag

Föreläsning 3 Innehåll

Diskutera Sortera objekt

Tentamen i Algoritmer & Datastrukturer i Java

Lösningsförslag till exempeltenta 2

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Laboration 2 Datastrukturer En liten uppgift Frågor

Algoritmer och datastrukturer. HI1029 8,0 hp Föreläsning 1

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Tentamen, EDA690 Algoritmer och Datastrukturer, Helsingborg

Listor. Koffman & Wolfgang kapitel 2, avsnitt , och 2.9

Lösningsförslag. Programmeringsmetodik, KV: Java och OOP. 17 januari 2004

Föreläsning 8: Exempel och problemlösning

4 13 / %.; 8 </" '': " / //&' " " ' * TelefonKostnad +,-%&. #!" $% " &' . > / ' 5 /' * 13/ &' static Math 1+" &'/ % 12 "" static "' * 1 /") %& &

Föreläsning 13. Träd

Föreläsning 14. Träd och filhantering

Tentamen LÖSNINGSFÖRSLAG. c) Tilldelningen C x = new D() ger kompileringsfel eftersom klassen D är abstrakt.

Tentamen Programmering fortsättningskurs DIT950

Tommy Färnqvist, IDA, Linköpings universitet

Programmering för språkteknologer II, HT2014. Rum

Föreläsning 7. Träd och binära sökträd

Föreläsning 4. Kö Implementerad med array Implementerad med länkad lista Djup kontra bredd Bredden först mha kö

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Abstrakta datastrukturer

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

Grundläggande datalogi - Övning 2

Föreläsning Datastrukturer (DAT036)

Stackar, köer, iteratorer och paket

Föreläsning 10. ADT:er och datastrukturer

Tentamen i Algoritmer & Datastrukturer i Java

Klassen BST som definierar binära sökträd med tal som nycklar och enda data. Varje nyckel är unik dvs förekommer endast en

Namn: (Ifylles av student) Personnummer: (Ifylles av student) Tentamensdatum: Tid: Hjälpmedel: Inga hjälpmedel

Föreläsning 11. ADT:er och datastrukturer

Föreläsning 2 Datastrukturer (DAT037)

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Lägg uppgifterna i ordning. Skriv uppgiftsnummer och din kod överst i högra hörnet på alla papper.

Föreläsning 3 Datastrukturer (DAT037)

OOP Objekt-orienterad programmering

F4. programmeringsteknik och Matlab

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Tentamen i Algoritmer & Datastrukturer i Java

Objektorienterad programmering E. Back to Basics. En annan version av printtable. Ett enkelt exempel. Föreläsning 10

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

Föreläsnings 9 - Exceptions, I/O

Tentamen Programmeringsteknik II Inledning. Anmälningskod:

Kurskod D0010E Datum Skrivtid 5tim

Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Övning vecka 6. public void method2() { //code block C method3(); //code block D }//method2

Föreläsning 14. Filhantering

Föreläsning 12. Länkade listor

Tentamen. Programmeringsmetodik, KV: Java och OOP. 17 januari 2002

if (n==null) { return null; } else { return new Node(n.data, copy(n.next));

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Lösningsförslag till tentamen i EDA690 Algoritmer och Datastrukturer, Helsingborg

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 5 Erik Nilsson, Institutionen för Datavetenskap, LiU

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Outline. Objektorienterad Programmering (TDDC77) En frukt har ett namn. Man kan lägga en frukt i en korg... Hashing. Undantag. Ahmed Rezine.

Objektorienterad Programmering (TDDC77)

List.java. List.java. Printed by Tom Smedsaas

Algoritmer. Två gränssnitt

Lösningsförslag till tentamen i EDAA01 programmeringsteknik fördjupningkurs

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 9 Jonas Lindgren, Institutionen för Datavetenskap, LiU

TENTAMEN PROGRAMMERING I JAVA, 5P SOMMARUNIVERSITETET

Algoritmer och datastrukturer. HI1029 8,0 hp Föreläsning 1

DAT043 - föreläsning 8

Parsing med Recursive Descent, Avbildningsklasser. Syntaxdiagram. Syntaxdiagram och kodning expression. Betrakta följande uttryck

Tentamen Programmeringsteknik II och NV2 (alla varianter) Skriv bara på framsidan av varje papper.

DAT043 Objektorienterad Programmering

Observera. Tentamen Programmeringsteknik II Skrivtid:

Ett problem. Kontrollstrukturer och arrayer. Arrayer. Lösningen. Arrayer och hakparanteser. Exempel int[] results; results = new int[10]; // 0..

Samlingar, Gränssitt och Programkonstruktion! Förelasning 11!! TDA540 Objektorienterad Programmering!

LÖSNINGSFÖRSLAG

Repetition av OOP- och Javabegrepp

TDDC30. Kursledning Kursledare: Jonas Lindgren. Labassistent: Jonas Lindgren Labassistent: Niklas Holma Labassistent: Erik Nilsson

Föreläsning 3 Datastrukturer (DAT037)

Interface. Interface. Tobias Wrigstad (baserat på bilder från Tom Smedsaas) 3 december 2010

Dagens text. Programmeringsteknik. Mer om Scanner-klassen. Dialogrutor (klassen JOptionPane) Bubbelsortering. Omslagsklasser.

Transkript:

Föreläsning 3 Stack

Föreläsning 3 ADT Stack Stack JCF Tillämpning Utvärdera ett postfix uttryck Stack implementerad med en array Stack implementerad med en länkad lista Evaluate postfix expressions Läsanvisningar och uppgifter

ADT Stack Grundprinciper: En stack fungerar som en hög. Man fyller på överst och man tar bort överst: Last In First Out - LIFO. Det är en av de vanligaste av datastrukturerna och används t.ex. av processorn. Möjliga metoder: create() empty() peak() pop() push(element)

Stack JCF Här hade det varit tydligt och enkelt att berätta om klassen Stack och vilka den ärver från och hur den används. Det finns en sådan klass som ärver från klassen Vector som är en synkroniserad lista. Enda problemet är att man normalt inte ska använda den när man behöver en stack utan använda Deque-interfacet för LinkedList eller ArrayDeque. Tyvärr har den då många fler metoder än en stack ska ha (deque är en slags kö där man kan stoppa in och ta bort element i båda ändar). Ni kan i denna kurs normalt välja vilken ni vill använda men det är bra om ni känner till detta.

Stack<E> java.lang.object java.util.abstractcollection<e> java.util.abstractlist<e> java.util.vector<e> java.util.stack<e> boolean empty() Tests if this stack is empty. E peek() Looks at the object at the top of this stack without removing it from the stack. E pop() Removes the object at the top of this stack and returns that object as the value of this function. E push(e item) Pushes an item onto the top of this stack. int search(object o) Returns the 1-based position where an object is on this stack.

Deque (interface) Implementeras av LinkedList och ArrayDeque Har stack-metoderna push, pop, peek och ärver isempty. Det är inte tillåtet att sätta in NULL-element i denna. Typiskt skapar man denna enligt: Deque<Integer> stack = new ArrayDeque<Integer>();

Tillämpning Omvänd polsk notation Omvänd polsk notation eller postfix notation var vanlig på miniräknare förr bland annat för att det är så processorn fungerar och bland annat för att man med denna lättare kan utföra sammansatta beräkningar utan parenteser. Man behöver inte heller ta hänsyn till prioritetsordningen mellan operatorer. 12 6 + 3 / För att utvärdera ett sådant uttryck använder man enklast en stack: 12 6 18 3 6 12 18

Algoritm create an empty stack of integers while there are more tokens get the next token if the first character of the token is a digit push the token on the stack else if the token is an operator pop the right operand off the stack pop the left operand off the stack evaluate the operation push the result onto the stack pop the stack and return the result

Uppgiften är att skriva en metod som utvärderar ett matematiskt uttryck skrivet på denna form. Här är ett enkelt program som anropar funktionen: import java.util.scanner; public class TestPostfixEvaluator { public static void main(string[] args) { PostfixEvaluator evaluator = new PostfixEvaluator(); String line; Scanner in = new Scanner(System.in); while(true){ System.out.println("Enter a postfix expression to evaluate"); line = in.nextline(); if(!line.equals("")){ try { int result = evaluator.eval(line); System.out.println("Value is " + result); catch (PostfixEvaluator.SyntaxErrorException ex) { System.out.println("Syntax error " + ex.getmessage()); else { break;

och här är ett skal för klassen med metoden: import java.util.stack; import java.util.scanner; import java.util.emptystackexception; public class PostfixEvaluator { public static class SyntaxErrorException extends Exception { SyntaxErrorException(String message) { super(message); private static final String OPERATORS = "+-*/"; private Stack<Integer> operandstack; private int evalop(char op) { //hit skickar vi en operator den ska nu utföras på de två översta talen på stacken som ska tas bort. Sedan ska resultatet upp på stacken private boolean isoperator(char ch) { return OPERATORS.indexOf(ch)!= -1; public int eval(string expression) throws SyntaxErrorException { //skapa en stack för denna beräkning String[] tokens = expression.split(" +"); try { for(string nexttoken : tokens){ if (Character.isDigit(nextToken.charAt(0))) { // det kommer ett tal så använd Integer.parseInt(nextToken)) och lägg det på stacken! else if (isoperator(nexttoken.charat(0))) { // det kommer en operator så använd evalop för att göra beräkningen på de 2 översta talen på stacken och lägg resultatet överst på stacken else { throw new SyntaxErrorException("Invalid character encountered"); //Vi har läst hela uttrycket och gjort alla beräkningar så dags att ta ut svaret som borde vara det enda kvar på stacken //Om stacken inte är tom kasta ett syntax error annars returnera resultatet catch (EmptyStackException ex) { throw new SyntaxErrorException("Syntax Error: The stack is empty");

Implementera en stack JCF två stackmöjligheter har båda problemet att vi kan göra saker man inte borde kunna göra med en stack eftersom en Vector och en Deque har metoder som tillåter det. Därför behöver vi skapa en egen klass om vi vill ha en riktig Stack. Denna kan då enklast använda en Vector, ArrayList eller LinkedList som inre datastruktur istället för att ärva från dessa. Eftersom detta är en kurs där vi lär oss att bygga datastrukturer ska vi implementera en stack som använder en länkad lista och en som använder en array. Vi skapar också ett interface de båda kan implementera: public interface StackInt<E> { E push(e obj); E peek(); E pop(); boolean empty();

Stack implementerad med en array Vid första anblicket kan det kännas naturligt att använda plats 0 som överst på stacken men det vore vansinnigt då vi skulle bli tvungna att flytta alla element varje gång lägger till något på stacken. Istället fyller man helt enkelt på arrayen och det sista elementet är då det översta. alla metoder blir O(1).

import java.util.emptystackexception; import java.util.arrays; public class ArrayStack<E> implements StackInt<E> { private E[] data; private int top; private int maxsize; public ArrayStack() { top = -1; maxsize = 10; data = (E[]) new Object[10]; @Override public E push(e obj) { if (top == maxsize-1) { reallocate(); top++; data[top] = obj; return obj; @Override public E pop() { if (empty()) { throw new EmptyStackException(); return data[top--]; @Override public E peek() { if (empty()) { throw new EmptyStackException(); return data[top]; @Override public boolean empty() { return top == -1; private void reallocate() { maxsize*=2; data=arrays.copyof(data,maxsize);

Stack implementerad med en länkad lista Här räcker det bra med enkellänkad lista eftersom vi endast skall göra förändringar i toppen (head) av listan. Vi utnyttja i en stack inte den länkade listans möjlighet att göra ändringar effektivt mitt i men vi får en stack som har precis rätt storlek på bekostnad av länkarna (vilket i och för sig kostar exakt lika mycket som arrayen är för stor maximalt). Alla operationer blir O(1).

import java.util.emptystackexception; public class LinkedStack<E> implements StackInt<E> { private static class Node<E> { private E data; private Node<E> next; private Node(E dataitem, Node<E> noderef) { data = dataitem; next = noderef; private Node<E> top; public LinkedStack<E>() { top = null; @Override public E push(e obj) { top = new Node<E>(obj, top); return obj; @Override public E pop() { if (empty()) { throw new EmptyStackException(); else { E result = top.data; top = top.next; return result; @Override public E peek() { if (empty()) { throw new EmptyStackException(); else { return top.data; @Override public boolean empty() { return top == null;

Läsanvisning och uppgifter KW 3.1, 3.2, 3.3, 3.4 Uppgifter: (SC Self Check, P Programing, PP Programing Projects, NB se sist i föreläsningen) Avsnitt 3.1: SC 1, 2, 3 Avsnitt 3.2: NB 8 Avsnitt 3.3: NB 9 (1p), 10, 11 (2p) Avsnitt 3.4: Case Study: Infix to postfix (sid 176) och Converting expressions with parenthesis (sid 185) Chapter Review: PP 7 (2p)

Uppgifter NB 8 På sid 156 börjar ett Case där man skall kontrollera att parenteser är balanserade i ett uttryck. Läs igenom Problem, analys och Design avsnitten och gör sedan en egen implementation. Titta på bokens lösning om du kör fast men försök att klara dig utan att titta.

NB 9 (1p) Implementera en stack med en ArrayList som inre datastruktur (ärv inte). Klassen skall implementera interfacet från föreläsningen. Skriv också en main som testar att klassens alla funktioner verkar fungera.

NB 10 Lägg till funktionen size(), peek(n), pop(n) och flush() till ArrayStack från föreläsningen. size() returnerar antal element på stacken peek(n) returnerar det n:te elementet på stacken utan att påverka stacken pop(n) returnerar det n:te elementet på stacken och tar bort detta från stacken flush() som tömmer stacken och returnerar det sista elementet på stacken Skriv också en main som testar funktionerna. OBS att pop(n) absolut ej får finnas i en stack värd namnet!

N B 11 (2p) Lägg till funktionen size(), peek(n), pop(n) och flush() till LinkedStack från föreläsningen. size() returnerar antal element på stacken peek(n) returnerar det n:te elementet på stacken utan att påverka stacken pop(n) returnerar det n:te elementet på stacken och tar bort detta från stacken flush() som tömmer stacken och returnerar det sista elementet på stacken Skriv också en main som testar funktionerna. OBS! att pop(n) inte ska finnas i en stack normalt!