# Zyklisches Array



## SebastianL (19. Mai 2012)

Hallo zusammen,

ich versuche mich gerade an folgender Aufgabe für mein Studium:

Der ADT Deque (engl. Double-Ended Queue) ist eine spezielle Form einer Queue, die das Einfügen und Entfernen von Elementen an beiden Enden der Queue gestattet. Implementieren Sie den ADT Deque auf Basis eines zyklischen Arrays.

Da Java nicht zu meinen stärken zählt komme ich nicht weiter. Habe mir versucht die Sachen selbst im Internet zu suchen, da es im Skript nicht sonderlich ausführlich erklärt ist, komme aber trotzdem nicht vorwärts.

Zum prüfen des Programms haben wir noch eine Testklasse, die mir die folgenden Fehler ausgibt:

1.Fehler in der insertStart()-Methode: Es wurde fehlerhaft eine Exception ausgelößt. Details: Es wurde versucht, einer Deque mit 2 Elementen ein neues, drittes Element hinzuzufügen. Dabei wurde fehlerhaft eine Exception 'ArrayIndexOutOfBoundsException' ausgelößt. Denken Sie daran, den Array als zyklischen Array zu realisieren und die Variablen indexFirst und indexAfterLast wieder am Anfang des Array starten zu lassen. indexFirst: '0', indexAfterLast: '2', arrayOfDeque: '[7, 9]'   

2.Fehler in der removeEnd()-Methode: Es wurde fehlerhaft eine Exception ausgelößt. Details: Es wurde versucht, die removeEnd()-Methode auf einer Deque mit 1 Element aufzurufen. Dabei wurde fehlerhaft eine Exception 'ArrayIndexOutOfBoundsException' ausgelößt. indexFirst: '9', indexAfterLast: '-1', arrayOfDeque: '[]'

Folgenden Code habe ich geschrieben:


```
public class ArrayDeque<E> extends AbstractArrayDeque<E>
{	
	public int size() 
	{
		return(capacity-indexFirst+indexAfterLast)%capacity;
	}

	public boolean isEmpty() 
	{
		return(indexAfterLast==indexFirst);
	}

	public void insertStart(E element) throws FullQueueException 
	{
		if(size()==capacity-1)
		{
			throw new FullQueueException("Queue voll.");
		}
		else
		{
			arrayOfDeque[indexFirst-1]=element;
			indexFirst=(indexFirst-1)%capacity;
			if(indexFirst>=arrayOfDeque.length)
			{
				indexFirst=0;
				indexAfterLast=0;
			}
		}
	}
	
	public void insertEnd(E element) throws FullQueueException 
	{
		if(size()==capacity-1)
		{
			throw new FullQueueException("Queue voll.");
		}
		else
		{
			arrayOfDeque[indexAfterLast]=element;
			indexAfterLast=(indexAfterLast+1)%capacity;
		}
	}

	public E removeStart() throws EmptyQueueException 
	{
		if (isEmpty())
		{
			throw new EmptyQueueException("Queue leer.");
		}
		else
		{
			E elem = (E) arrayOfDeque[indexFirst];
			arrayOfDeque[indexFirst]=null;
			indexFirst=(indexFirst+1)%capacity;
			return elem;
		}
	}

	public E removeEnd() throws EmptyQueueException 
	{
		if (isEmpty())
		{
			throw new EmptyQueueException("Queue leer.");
		}
		else
		{
			indexAfterLast=(indexAfterLast-1);
			E elem = (E) arrayOfDeque[indexAfterLast];
			arrayOfDeque[indexAfterLast]=null;
			if(indexAfterLast>=arrayOfDeque.length)
			{
				indexAfterLast=0;
			}
			return elem;
		}
	}
}
```


----------



## Firephoenix (19. Mai 2012)

Meinst du mit zyklischem Array sowas wie das Ding hier auf Seite 24?
http://www.stormware-computer.de/script/kapitel_1_2.pdf

wenn du auf der Hochschule Fulda bist findet man über google sogar eine Lösung zu der Aufgabe auf Pastebin von einem Kollegen von dir (zumindest wenn ich den package-namen da richtig gelesen habe und die aufgaben identisch sind) wenn man nach AbstractArrayDeque sucht - wird dir beim Java-verständnis nicht helfen aber ein Blick schadet vielleicht nicht 

Ansonsten wäre die Testklasse und die Abstrakte Klasse von der du erbst interessant, 

Gruß


----------



## SebastianL (19. Mai 2012)

Ja bin ich, auf die Idee hätte ich auch selbst kommen können...

Ich hatte das auch erst so ähnlich. Habe jeweils in der Zeile: indexFirst = (indexFirst-1+CAPACITY)%CAPACITY; das capacity in der Klammer vergessen, und dann habe ich versucht mit einer weiteren ifbedingunen das ganze zu lösen, was nicht ganz zielführend war.

Danke, damit hat sich das Thema erledigt. :toll:


----------

