/** * StackByQueue * realizza una pila usando una coda per memorizzare i dati * classe per esercitazione: laboratorio 8 * La realizzazione e', ovviamente, inefficiente * @author Adriano Luchetta @ @version 24.Nov.2006 * @version 21-Nov-2005 * @version 3-Dic-2004 * @see Queue */ public class StackByQueue implements Stack { private Queue q; public StackByQueue() { q = new ArQueue(); } public int size() { return q.size(); } public void makeEmpty() { q.makeEmpty(); } public boolean isEmpty() { return q.isEmpty(); } /** inserisce l'elemento specificato in cima alla pila @param obj elemento da inserire */ public void push(Object obj) { q.enqueue(obj); } /** ispeziona l'elemento in cima alla pila O(n) @return elemento in cima alla pila @throws EmptyStackException se la pila e' vuota */ public Object top() throws EmptyStackException { if (isEmpty()) throw new EmptyStackException(); // ruota la coda di size - 1 posti rotate(q.size() - 1); return q.getFront(); } /** estrae l'elemento in cima alla pila O(n) @return elemento in cima alla pila @throws EmptyStackException se la pila e' vuota */ public Object pop() throws EmptyStackException { if (isEmpty()) throw new EmptyStackException(); // ruota la coda di size - 1 posti rotate(q.size() - 1); return q.dequeue(); } /* ruota la coda di k posti estraendo l'elemento in testa e reinserendolo in coda si ottiene la rotazione di un posto */ private void rotate(int k) { for (int i = 0; i < k; i++) q.enqueue(q.dequeue()); } }