/** * Created by Jan on 12.01.2017. */ public class Queue implements MyQueue { public Element guard = new Element(null, -1); public int rozmiar; public Queue(){ clear(); } public void enqueue(T value, int priority){ int index = 0; Element element = guard.getNext(); while(element.getPriority()>priority){ element = element.getNext(); index++; } insert(index, value, priority); } public T top(){ if(rozmiar == 0) return null; else { return getElement(0); } } public void pop(){ Element element = getElementB(0); element.detach(); rozmiar--; } public void merge(Queue queue){ for (int i = 0; i < queue.getSize(); i++) { this.enqueue(queue.getElement(i), queue.getElementB(i).getPriority()); } } public void clear(){ guard.setNext(guard); guard.setPrevious(guard); rozmiar = 0; } public void insert(int index, T value, int priority) throws IndexOutOfBoundsException { if (index < 0 || index > rozmiar) throw new IndexOutOfBoundsException(); Element element = new Element(value,priority); element.attachBefore(getElementB(index)); rozmiar++; } public T getElement(int index){ Element element = guard.getNext(); for (int i = 0; i < index; i++) element = element.getNext(); return element.getValue(); } public Element getElementB(int index){ Element element = guard.getNext(); for (int i = 0; i < index; i++) element = element.getNext(); return element; } public int getSize() { return rozmiar; } private static final class Element{ private int priority; private T value; private Element previous; private Element next; public Element(T v,int priority){ setValue(v); setPriority(priority); } public void setPriority(int priority) { this.priority = priority; } public int getPriority(){ return priority; } public void setValue(T value){ this.value = value; } public T getValue(){ return value; } public Element getPrevious(){ return previous; } public Element getNext(){ return next; } public void setPrevious(Element previous){ this.previous = previous; } public void setNext(Element next){ this.next = next; } public void attachBefore(Element el){ Element previous = el.getPrevious(); setNext(el); setPrevious(previous); el.setPrevious(this); previous.setNext(this); } public void detach(){ previous.setNext(next); next.setPrevious(previous); } } } public class Test { public static void main(String [] args){ Queue kolejka = new Queue(); Queue kolejka_druga = new Queue(); kolejka.enqueue(10,10); System.out.println(kolejka.top()); kolejka.enqueue(9,9); System.out.println(kolejka.top()); kolejka.enqueue(20,20); System.out.println(kolejka.top()); kolejka.pop(); System.out.println(kolejka.top()); kolejka_druga.enqueue(21,21); kolejka_druga.enqueue(5,5); kolejka.merge(kolejka_druga); System.out.println(kolejka.top()); kolejka.pop(); System.out.println(kolejka.top()); kolejka.pop(); System.out.println(kolejka.top()); } }