Implementación de pilas basada en arrays En esta implementación basada Índice del array Primer ítem en arrays, la posición en el array de la pila del elemento cima de la pila 0 va bajando a medida que se 1 Cima actual insertan ítems, y subiendo de la pila a medida que se sacan. ... El inicio de la pila cima Última se hallará siempre en el posición ... elemento 0 del array. disponible En cierto sentido, la pila tamaño-1 se va formando "cabeza abajo" en el array. 19
ArrayStack
,1
public class ArrayStack implements Stack { final static int DEFAULT_CAPACITY = 16; private Object [] stack; private int top = -1; private int capacity; public ArrayStack( int cap ) { capacity = cap; stack = new Object[ cap ]; } public ArrayStack() { this( DEFAULT_CAPACITY ); }
20
10
Array Stack
,2
public boolean isEmpty() { return ( top < 0 ); } public void clear() { for ( int i = 0; i < top; i++ ) stack[ i ] = null;
// para recogida de basura
top = -1; }
21
Array Stack
,3
public Object pop() throws EmptyStackException { if ( isEmpty() ) throw new EmptyStackException(); else { Object ret = stack[ top ]; stack[ top-- ] = null;
//para recogida de basura
return ret; } }
22
11
Array Stack
,4
public void push(Object o) { if ( top == capacity-1 ) grow(); stack[ ++top ] = o; } private void grow() { Object [] old = stack; int oldCapacity = capacity; capacity *= 2; stack = new Object[ capacity ]; System.arraycopy( old, 0, stack, 0, oldCapacity ); } 23
Implementación de colas basada en arrays Dos supuestos: 0
1.
front
front
front+1 ...
rear- 1 rear
...
tamaño-1
ocupado
2. 0
rear
rear-1
ocupado
la cola se hace circular rear
...
front
front
...
tamaño-1
ocupado 24
12
Estructura circular de las colas basadas en arrays fin del array tamaño-1
inicio del array
fin del array inicio de la cola
front 0
front+1
... rear+1 rear
fin de la cola
rear -1 tamaño-1
inicio del array fin de la cola
rear 0
rear+1
...
...
... front+1
rear -1
front
...
inicio de la cola
Array Queue
25
,1
public class ArrayQueue implements Queue { final static int DEFAULT_CAPACITY= 16; private Object[] queue; private int front; private int rear; private int capacity; private int size = 0; public ArrayQueue( int cap ) { capacity = cap; front = 0; rear = capacity - 1; queue= new Object[capacity]; } public ArrayQueue() { this( DEFAULT_CAPACITY ); }
26
13
Array Queue
,2
public boolean isEmpty() { return ( size == 0 ); } public void clear() { size = 0; front = 0; rear = capacity - 1; for ( int i = 0; i < capacity; i++ ) queue[ i ] = null; // para recogida de basura } public void add(Object o) { if ( size == capacity ) grow(); rear = ( rear + 1 ) % capacity; queue[ rear ] = o; size++; } 27
Array Queue
,3
public Object remove() throws NoSuchElementException { if ( isEmpty() ) throw new NoSuchElementException(); else { Object ret = queue[ front ]; queue[ front ] = null;
// para recogida de basura
front = (front + 1) % capacity; size--; return ret; } }
28
14
Aumento del tamaño de unQueue Array Supuesto básico: front < rear, 0
antes
... front ...
rear ... tamaño -1
ocupado
front < rear, 0
... front ...
después rear ...
ocupado
antiguo antiguo ... tamaño tamaño -1
tamaño-1
29
Aumento del tamaño de unQueue Array Supuesto más complicado: rear < front, 0
...
antes
rear ... front ...
ocupado
rear < front, 0
...
ocupado
después
rear ...
ocupado
tamaño -1
antiguoantiguo ... tamaño -1 tamaño
front
...
tamaño-1
ocupado 30
15
Array Queue
,4
private void grow() { Object[] old= queue; int oldCapacity= capacity; capacity *= 2; queue= new Object[capacity]; if ( size == 0 ) return; else if ( front <= rear ) { System.arraycopy(old, front, queue, front, size ); } else if ( rear < front ) { System.arraycopy(old, 0, queue, 0, rear + 1); System.arraycopy(old, front, queue, front + oldCapacity, oldCapacity - front ); front += oldCapacity; } }
31
16