> 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/ud6-estructuras-de-datos-avanzadas/page-2/pilas.md).

# Pilas

Unha **Pila** é unha estrutura de **datos lineal** que segue o principio LIFO (*Last In, First Out*), o que significa que o último elemento en entrar é o primeiro en saír.

<figure><img src="/files/qGGqnmqCQO5iKBH93Nzj" alt=""><figcaption></figcaption></figure>

As principais características das pilas son:

* **Acceso restrinxido:** A diferenza das listas, onde podes acceder a calquera posición, nunha pila a interacción está limitada exclusivamente ao extremo superior, chamado Cume ou *Top*.
* **Comportamento Dinámico:** Ao igual que as listas ligadas, as pilas poden medrar indefinidamente (mentres haxa memoria), engadindo nodos de forma non contigua.
* **Operacións Atómicas:** As operacións básicas dunha pila son extremadamente eficientes:
  * **Push (Apilar):** Engade un elemento ao cume. Custo: O(1).
  * **Pop (Desapilar):** Retira o elemento do cume. Custo:O(1).
  * **Peek/Top:** Consulta o valor do cume sen retiralo. Custo:O(1)

Un posible exemplo de comportamento das pilas sería o seguinte:

<figure><img src="/files/rlVhYYQyQyj8OyQUSZar" alt=""><figcaption></figcaption></figure>

{% embed url="<https://codepen.io/Iago-Magide-Rey/pen/GgjBzrQ>" %}

## Variantes de implementación

A nivel teórico, existen diferentes variantes de pilas con comportamento común pero implementación diferente en función das necesidades:

* **Pila baseada en Nodos (Ligada):** É a máis común. Cada nodo garda o dato e un punteiro ao nodo que ten debaixo. É a máis flexible en memoria.
* **Pila baseada en Array (Estática/Dinámica):** Utiliza un array e un índice que marca a posición do cume. É moi rápida, pero se o array se chea, require unha operación de redimensionamento custosa: O(n)

<figure><img src="/files/T2heXyBqPegKOuKJnOrF" alt=""><figcaption></figcaption></figure>

## Exemplos de uso

As pilas son unha boa solución sempre que os elementos requiran tratamento LIFO. Alguns exemplos de uso nos que se pode empregar a pila como ferramenta para resolver un problema son:&#x20;

* **Recursividade e chamadas a funcións:** Cando programa chama a unha función A, e esta a unha función B, e esta a sua vez a función C vanse apilando. De tal forma que cando remata de avaliar C, a JVM de Java sabe que está en B, e asi sucesivamente.&#x20;

{% hint style="warning" %}
A pila do sistema non ten capacidade infinita, e pode provocar erros de **StackOverflow**
{% endhint %}

* **Compiladores:** Cando un compilador avalia unha expresión de tipo 3+ (4-2) / 3, emprega unha pila para colocar os operadores e os valores na orden correcta para a súa avaliacion
* As funcionalidades de **desfacer das aplicacións**, ou un **historial de navegación (funcionalidade "atras/adelante")**, serían exemplos de uso de pilas


---

# 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/ud6-estructuras-de-datos-avanzadas/page-2/pilas.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.
