From 7a7d4beedbba358a0e8fc17536276243416dfb15 Mon Sep 17 00:00:00 2001 From: Fabio Scotto di Santolo Date: Tue, 3 Apr 2018 10:49:11 +0200 Subject: [PATCH] aggiunte implementazioni coda prioritaria --- .../adt/queue/AbstractPriorityQueue.java | 2 +- .../adt/queue/SortedPriorityQueue.java | 59 +++++++++++++++++ .../adt/queue/UnsortedPriorityQueue.java | 64 +++++++++++++++++++ 3 files changed, 124 insertions(+), 1 deletion(-) create mode 100644 src/it/algoritmi/adt/queue/SortedPriorityQueue.java create mode 100644 src/it/algoritmi/adt/queue/UnsortedPriorityQueue.java diff --git a/src/it/algoritmi/adt/queue/AbstractPriorityQueue.java b/src/it/algoritmi/adt/queue/AbstractPriorityQueue.java index cc604d5..623e7f2 100644 --- a/src/it/algoritmi/adt/queue/AbstractPriorityQueue.java +++ b/src/it/algoritmi/adt/queue/AbstractPriorityQueue.java @@ -38,7 +38,7 @@ public abstract class AbstractPriorityQueue, V> implemen //-------- fine della classe annidata ------------------------ /** Il comparatore che definisce l'ordine tra le chiavi della coda prioritaria */ - private Comparator comparator; + protected Comparator comparator; /** Crea una coda prioritaria vuota che usa il comparatore fornito. */ protected AbstractPriorityQueue(Comparator comparator) { diff --git a/src/it/algoritmi/adt/queue/SortedPriorityQueue.java b/src/it/algoritmi/adt/queue/SortedPriorityQueue.java new file mode 100644 index 0000000..9d11b62 --- /dev/null +++ b/src/it/algoritmi/adt/queue/SortedPriorityQueue.java @@ -0,0 +1,59 @@ +package it.algoritmi.adt.queue; + +import java.util.Comparator; + +import it.algoritmi.adt.Entry; +import it.algoritmi.adt.Position; +import it.algoritmi.adt.PositionalList; +import it.algoritmi.adt.list.LinkedPositionalList; + +public class SortedPriorityQueue, V> extends AbstractPriorityQueue { + + /** Contenitore principale delle voci della coda prioritaria */ + private PositionalList> list = new LinkedPositionalList<>(); + + /** Crea una coda prioritaria vuota che usa l'ordine naturale tra le chiavi. */ + public SortedPriorityQueue() { + super(); + } + + public SortedPriorityQueue(Comparator comparator) { + this.comparator = comparator; + } + + @Override + public int size() { + return list.size(); + } + + + @Override + public Entry insert(K key, V value) throws IllegalArgumentException { + checkKey(key); // metodo ausiliario di verifica (può lanciare eccezione) + Entry newest = new PQEntry<>(key, value); + Position> walk = list.last(); + // procede a ritroso, cercando chiavi minori + while (walk != null && compare(newest, walk.getElement()) < 0) + walk = list.before(walk); + if (walk == null) + list.addFirst(newest); + else + list.addAfter(walk, newest); + return newest; + } + + + @Override + public Entry min() { + if(list.isEmpty()) return null; + return list.first().getElement(); + } + + + @Override + public Entry removeMin() { + if(list.isEmpty()) return null; + return list.remove(list.first()); + } + +} diff --git a/src/it/algoritmi/adt/queue/UnsortedPriorityQueue.java b/src/it/algoritmi/adt/queue/UnsortedPriorityQueue.java new file mode 100644 index 0000000..89b715d --- /dev/null +++ b/src/it/algoritmi/adt/queue/UnsortedPriorityQueue.java @@ -0,0 +1,64 @@ +package it.algoritmi.adt.queue; + +import java.util.Comparator; + +import it.algoritmi.adt.Entry; +import it.algoritmi.adt.Position; +import it.algoritmi.adt.PositionalList; +import it.algoritmi.adt.list.LinkedPositionalList; + +/** Un'implementazione di coda prioritaria mediante una lista non ordinata. */ +public class UnsortedPriorityQueue, V> extends AbstractPriorityQueue { + + /** Contenitore principale delle voci della coda prioritaria */ + private PositionalList> list = new LinkedPositionalList<>(); + + /** Crea una coda prioritaria vuota che usa l'ordine naturale tra le chiavi. */ + public UnsortedPriorityQueue() { + super(); + } + + /** Crea una coda prioritaria vuota che usa il comparatore fornito. */ + public UnsortedPriorityQueue(Comparator comparator) { + super(comparator); + } + + /** Restituisce la Position di una delle voci aventi chiave minima. */ + private Position> findMin() { + Position> small = list.first(); + for(Position> walk : list.positions()) + if(compare(walk.getElement(), small.getElement()) < 0) + small = walk; + return small; + } + + /** Restituisce il numero di voci presenti nella coda prioritaria. */ + @Override + public int size() { + return list.size(); + } + + /** Inserisce una coppia chiave-valore e restituisce la voce creata. */ + @Override + public Entry insert(K key, V value) throws IllegalArgumentException { + checkKey(key); // metodo ausiliario di verifica (può lanciare eccezione) + Entry newest = new PQEntry<>(key, value); + list.addLast(newest); + return newest; + } + + /** Restituisce una delle voci aventi chiave minima (senza rimuoverla). */ + @Override + public Entry min() { + if(list.isEmpty()) return null; + return findMin().getElement(); + } + + /** Elimina e restituisce una delle voci aventi chiave minima. */ + @Override + public Entry removeMin() { + if(list.isEmpty()) return null; + return list.remove(findMin()); + } + +}