> For the complete documentation index, see [llms.txt](https://educacion.gitbook.io/programacion/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://educacion.gitbook.io/programacion/exercicios-java/ud6-solucions/interfaces-iterable-e-iterator.md).

# Interfaces: Iterable e Iterator

1. Pila

```java
import java.util.Iterator;

public class IteradorPilas<E> implements Iterator<E> {

    private Nodo<E> actual;
    
    public IteradorPilas(Nodo<E> cima) {
        this.actual = cima;
    }

    @Override
    public boolean hasNext() {
        return actual != null;
    }

    @Override
    public E next() {
        if (!hasNext()) {
            return null;
        }
        E elemento = actual.getElemento();
        actual = actual.getSiguiente();
        return elemento;
    }

}
```

```java
public class Pila<E> implements Iterable<E>{

    private Nodo<E> cima;
    private int tamano;

    public Pila() {
        this.cima = null;
        this.tamano = 0;
    }

    // Engade un elemento á parte superior
    public void push(E elemento) {
        Nodo<E> novoNodo = new Nodo<>(elemento);
        if (cima != null) {
            novoNodo.setSiguiente(cima);
        }
        cima = novoNodo;
        tamano++;
    }

    // Retira e devolve o elemento da cima
    public E pop() {
        if (isEmpty()) {
            return null; // Ou lanzar unha excepción tipo EmptyStackException
        }
        E elemento = cima.getElemento();
        cima = cima.getSiguiente();
        tamano--;
        return elemento;
    }

    // Mira o elemento da cima sen retiralo
    public E peek() {
        if (isEmpty()) {
            return null;
        }
        return cima.getElemento();
    }

    // Devolve o número de elementos
    public int size() {
        return tamano;
    }

    // Comproba se a pila está baleira (O que che faltaba!)
    public boolean isEmpty() {
        return cima == null;
    }
    
    @Override
    public String toString() {
        if (isEmpty()) {
            return "Pila baleira";
        }
    
        StringBuilder sb = new StringBuilder();
        sb.append("CIMA\n ↓\n");
        
        Iterator<E> it = pila.iterator();
        while (it.hasNext()) {
            E val = it.next();
            sb.append("[ ").append(val).append(" ]\n");
        }
         sb.append(" ↓\nBASE");
        
        
        return sb.toString();
    }
    
    @Override
    public Iterator<E> iterator() {
        return new IteradorPilas<>(cima);  // pasa o nodo cima
    }
    
    
}
```

```java
public class App{
    public static void main(String[] args) {
        Pila<String> pila = new Pila();
        pila.push("Programación");
        pila.push("Bases de datos");
        pila.push("Contornos de desenvolvemento");

        for (String s: pila){
            System.out.println(s);
        }

        System.out.println(pila);
    }
}
```

2. Pila

```java
public enum TipoDocumento {
    PDF,
    DOCX,
    PPT
}
```

```java
package GestorDeImpresion;

public class Documento {

    private String nome;
    private int tamano;
    private TipoDocumento tipo;

    public Documento(String nome, TipoDocumento tipo, int tamano){
        this.nome = nome;
        this.tipo = tipo;
        this.tamano = tamano;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public int getTamano() {
        return tamano;
    }

    public void setTamano(int tamano) {
        this.tamano = tamano;
    }

    public TipoDocumento getTipo() {
        return tipo;
    }

    public void setTipo(TipoDocumento tipo) {
        this.tipo = tipo;
    }

    @Override
    public String toString() {
        return "Documento{" +
                "nome='" + nome + '\'' +
                ", tamano=" + tamano +
                ", tipo=" + tipo +
                '}';
    }
}

```

```java
package GestorDeImpresion;

import javax.print.Doc;
import java.util.*;

public class XestorImpresion {

    private List<Documento> colaImpresion;

    public XestorImpresion(){
        colaImpresion = new ArrayList<>();
    }

    public void enviarDocumento(Documento doc) {
        //colaImpresion.addLast(doc); // FIFO estándar
        colaImpresion.add(colaImpresion.size(), doc);
    }

    public void enviarUrxente(Documento doc){
        //colaImpresion.addFirst(doc);
        colaImpresion.add(0,doc);
    }

    public void imprimir(){
        System.out.println("Imprimiendo");
        Iterator<Documento> it = colaImpresion.iterator();
        while (it.hasNext()){
            Documento doc = it.next();
            it.remove();
            System.out.println(doc);
        }
        /*while (!colaImpresion.isEmpty()){
            Documento doc = colaImpresion.pollFirst();
            System.out.println(doc);
        }*/
        System.out.println("Fin impresión");
    }

    public void cancelarUltimo(){
        if (!colaImpresion.isEmpty()){
            Documento doc = colaImpresion.remove(colaImpresion.size()-1);
            System.out.println("Eliminado da cola:" + doc);
        }
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder("XestorImpresion{ colaImpresion = ");
        boolean primero = true;
        for(Documento doc: colaImpresion){
            if (primero)
                primero = false;
            else
                sb.append(", ");
            sb.append(doc);
        }
        sb.append('}');
        return sb.toString();
    }
}

```

```java
package GestorDeImpresion;

public class App {
    public static void main(String[] args) {
        XestorImpresion xestor = new XestorImpresion();

        // 1. Crear documentos iniciais
        Documento d1 = new Documento("informe",TipoDocumento.DOCX, 2000);
        Documento d2 = new Documento("informeDireccion",TipoDocumento.PDF, 3000);
        Documento d3 = new Documento("Marketing",  TipoDocumento.PPT, 20);

        // 2. Enviar ao xestor e mostrar estado
        System.out.println("--- Enviar 3 documentos ---");
        xestor.enviarDocumento(d1);
        xestor.enviarDocumento(d2);
        xestor.enviarDocumento(d3);
        System.out.println(xestor);
        System.out.println();

        // 3. Crear ManualUsuario.pdf e enviar de urxencia
        System.out.println("--- Enviar urxente ---");
        Documento urxente = new Documento("ManualUsuario",  TipoDocumento.PDF, 1);
        xestor.enviarUrxente(urxente);
        System.out.println(xestor);
        System.out.println();

        // 4. Cancelar último envío
        System.out.println("--- Cancelar último ---");
        xestor.cancelarUltimo();
        System.out.println(xestor);
        System.out.println();

        // 5. Imprimir seguinte documento
        System.out.println("--- Executar impresión ---");
        xestor.imprimir(); // Debería imprimir o ManualUsuario.pdf
        System.out.println(xestor);
    }
}

```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://educacion.gitbook.io/programacion/exercicios-java/ud6-solucions/interfaces-iterable-e-iterator.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
