Föreläsning 3. Stack

Relevanta dokument
Föreläsning 3. Stack

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 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista Läsanvisningar och uppgifter

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

Länkade strukturer. (del 2)

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

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

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

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

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

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

Tentamen i Algoritmer & Datastrukturer i Java

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

Lösningsförslag till exempeltenta 2

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

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

Föreläsning 4 Innehåll

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

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

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

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

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

Tommy Färnqvist, IDA, Linköpings universitet

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

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

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

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

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

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

Föreläsning 13. Träd

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

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

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

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

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

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

Stackar, köer, iteratorer och paket

Tentamen, EDA690 Algoritmer och Datastrukturer, Helsingborg

Abstrakta datastrukturer

Tentamen i Algoritmer & Datastrukturer i Java

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

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

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

Föreläsning 12. Länkade listor

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

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

Tentamen i Algoritmer & Datastrukturer i Java

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

Föreläsning Datastrukturer (DAT036)

Exempel. Arrayer. Lösningen. Ett problem. Arrayer och hakparanteser. Arrayer

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

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

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

DAT043 Objektorienterad Programmering

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

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

Laboration 13, Arrayer och objekt

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Algoritmer. Två gränssnitt

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

Grundläggande datalogi - Övning 2

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

F4. programmeringsteknik och Matlab

F3: Recursive descent, tokenisering, avbildningar och undantag. Carl Nettelblad

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

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

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.

Arrayer. results

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

Föreläsning 2 Datastrukturer (DAT037)

OOP Objekt-orienterad programmering

OOP Objekt-orienterad programmering

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

EDAA20 Föreläsning Klassen ArrayList. Viktiga operationer på ArrayList. Generisk klass

TENTAMEN PROGRAMMERING I JAVA, 5P SOMMARUNIVERSITETET

Föreläsning 3 Datastrukturer (DAT037)

Konstruktion av klasser med klasser

LÖSNINGSFÖRSLAG

TENTAMEN: Algoritmer och datastrukturer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Kurskod D0010E Datum Skrivtid 5tim

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

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-16, TDA540. Dag: , Tid:

Föreläsning 14. Filhantering

Tentamen Programmeringsteknik II för STS Skrivtid: Inga hjälpmedel.

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)

Föreläsning 2, vecka 8: Repetition

DAT043 - föreläsning 8

Föreläsning 1 Datastrukturer (DAT037)

DAT043 Objektorienterad programmering för D, DIT011 Objektorienterad programvaruutveckling för GU

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren att du har förstått dessa även om detaljer kan vara felaktiga.

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

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

Stack JCF I JCF har vi två alternativ: Stack som ärver från klassen Vector. Problem: Ärver metoder som en Stack inte ska ha. Vector är synkroniserad och bör ej användas om man inte har behov av detta. Deque-interfacet implementeras av LinkedList och ArrayDeque. Problem: Har metoder en stack inte ska ha Lösning: Skriv en egen. I kursen när vi behöver en stack för problemlösning är det ok att använda JCF s lösningar trots bristerna.

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 position where an object is on this stack. The top object is in position 1, the next in position 2,

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. Fördelar: Processorn arbetar på detta sätt Man kan lättare utföra sammansatta beräkningar utan parenteser Man behöver inte ta hänsyn till prioritetsordningen mellan operatorer Exempel: 12 6 + 3 / Utvärderas enklast med en stack: 12 6 12 18 3 18 6

Algoritm för omvänd polsk notation 12 6 + 3 / 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 12 6 18 3 6 12 18

För att förstå sig på stackar behöver man framförallt använda dem. Därför ska ni börja med att skriva en metod som utvärdera postfix mha en stack. Här är ett enkelt program som anropar metoden: 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.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(" +");//delar upp strängen vid mellanslag 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å anropa evalop för att göra beräkningen med operatorn 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 Då JCF s stackmöjligheter har brister kommer du oftast vilja implementera en egen. Enklast skapar du då en klass som använder en Vector, ArrayList eller LinkedList som inre datastruktur (istället för att ärva). Vi ska här implementera en stack med en array, och en stack med en länkad lista. Först skapar vi 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 Ska index 0 i arrayen motsvara toppen på stacken? Nej! Varje gång vi gör pop eller push måste vi då flytta alla element. Istället motsvarar det sista elementet toppen. När man lägger till ett element lägger man det bara sist. När man tar bort ett element behöver inga andra flyttas. Vi behöver bara hålla reda på index för toppen. 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[maxSize]; public E push(e obj) { if (top == maxsize-1) { reallocate(); top++; data[top] = obj; return obj; public E pop() { if (empty()) { throw new EmptyStackException(); return data[top--]; public E peek() { if (empty()) { throw new EmptyStackException(); return data[top]; public boolean empty() { return top == -1; private void reallocate() { maxsize*=2; data=arrays.copyof(data,maxsize);

Stack implementerad med en länkad lista Enkellänkad lista - ändringar endast i toppen (head) En stack utnyttjar inte den länkade listans möjlighet att göra ändringar effektivt mitt i Stacken har precis rätt storlek Referenserna tar upp en plats per data vilket betyder att den kräver dubbla utrymmet jämfört med en full array. Eftersom vi maximalt har en halvtom array betyder det att listan alltid slösar lika mycket utrymme som arrayen slösar som mest (kräver då att vi krymper arrayen när stacken töms) 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; public E push(e obj) { top = new Node<E>(obj, top); return obj; public E pop() { if (empty()) { throw new EmptyStackException(); else { E result = top.data; top = top.next; return result; public E peek() { if (empty()) { throw new EmptyStackException(); else { return top.data; public boolean empty() { return top == null;