{ "cells": [ { "cell_type": "markdown", "id": "30c1d7f6", "metadata": {}, "source": [ "## Pilhas em Python\n", "\n", "Neste notebook vamos implementar uma **Pilha** (stack): uma estrutura de dados do tipo **LIFO** (*Last In, First Out*), em que o **último** elemento inserido é o **primeiro** a ser removido.\n", "\n", "A pilha é construída sobre um vetor de **capacidade fixa** e controla a posição do topo pelo atributo `topo`, que começa em `-1` indicando que a pilha está vazia.\n" ] }, { "cell_type": "markdown", "id": "c62d468e", "metadata": {}, "source": [ "### A classe `Pilha`\n", "\n", "Os principais métodos são:\n", "\n", "- `esta_vazia()`: retorna `True` quando `topo == -1`;\n", "- `esta_cheia()`: retorna `True` quando `topo == capacidade - 1`;\n", "- `empilhar(valor)`: insere o valor no topo;\n", "- `desempilhar()`: remove e retorna o elemento do topo;\n", "- `ver_topo()`: retorna o elemento do topo **sem** removê-lo;\n", "- `imprimir()`: mostra os elementos da base até o topo.\n" ] }, { "cell_type": "code", "execution_count": 1, "id": "3f3767eb", "metadata": { "execution": { "iopub.execute_input": "2026-09-28T17:09:02.808823Z", "iopub.status.busy": "2026-09-28T17:09:02.808629Z", "iopub.status.idle": "2026-09-28T17:09:02.822340Z", "shell.execute_reply": "2026-09-28T17:09:02.821413Z" } }, "outputs": [], "source": [ "class Pilha:\n", " def __init__(self, capacidade):\n", " self.capacidade = capacidade\n", " self.topo = -1\n", " self.valores = [0] * capacidade\n", "\n", " def esta_vazia(self):\n", " return self.topo == -1\n", "\n", " def esta_cheia(self):\n", " return self.topo == self.capacidade - 1\n", "\n", " def empilhar(self, valor):\n", " if self.esta_cheia():\n", " return print(\"Pilha cheia. Não é possível empilhar.\")\n", " self.topo += 1\n", " self.valores[self.topo] = valor\n", "\n", " def desempilhar(self):\n", " if self.esta_vazia():\n", " return print(\"Pilha vazia. Não é possível desempilhar.\")\n", " valor = self.valores[self.topo]\n", " self.topo -= 1\n", " return valor\n", "\n", " def ver_topo(self):\n", " if self.esta_vazia():\n", " return print(\"Pilha vazia.\")\n", " return self.valores[self.topo]\n", "\n", " def imprimir(self):\n", " for i in range(self.topo + 1):\n", " print(self.valores[i], end=' | ')\n", " print()\n" ] }, { "cell_type": "markdown", "id": "7e795f0c", "metadata": {}, "source": [ "### Testando a pilha vazia\n", "\n", "Criamos uma pilha com capacidade 5 e tentamos desempilhar antes de inserir qualquer coisa. O método `desempilhar()` deve avisar que a pilha está vazia.\n" ] }, { "cell_type": "code", "execution_count": 2, "id": "8334df93", "metadata": { "execution": { "iopub.execute_input": "2026-09-28T17:09:02.824582Z", "iopub.status.busy": "2026-09-28T17:09:02.824401Z", "iopub.status.idle": "2026-09-28T17:09:02.829242Z", "shell.execute_reply": "2026-09-28T17:09:02.828325Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "A pilha está vazia? True\n", "Pilha vazia. Não é possível desempilhar.\n" ] } ], "source": [ "pilha = Pilha(5)\n", "print(\"A pilha está vazia?\", pilha.esta_vazia())\n", "pilha.desempilhar()\n" ] }, { "cell_type": "markdown", "id": "bddc726f", "metadata": {}, "source": [ "### Empilhando os caracteres do nome\n", "\n", "Empilhamos as letras de `RAMON` uma a uma. Repare que o topo é sempre a **última** letra inserida.\n" ] }, { "cell_type": "code", "execution_count": 3, "id": "b177c3cd", "metadata": { "execution": { "iopub.execute_input": "2026-09-28T17:09:02.831030Z", "iopub.status.busy": "2026-09-28T17:09:02.830872Z", "iopub.status.idle": "2026-09-28T17:09:02.834926Z", "shell.execute_reply": "2026-09-28T17:09:02.833687Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Empilhou R | topo: R\n", "R | \n", "Empilhou A | topo: A\n", "R | A | \n", "Empilhou M | topo: M\n", "R | A | M | \n", "Empilhou O | topo: O\n", "R | A | M | O | \n", "Empilhou N | topo: N\n", "R | A | M | O | N | \n" ] } ], "source": [ "for letra in \"RAMON\":\n", " pilha.empilhar(letra)\n", " print(f\"Empilhou {letra} | topo: {pilha.ver_topo()}\")\n", " pilha.imprimir()\n" ] }, { "cell_type": "markdown", "id": "83a7617c", "metadata": {}, "source": [ "### Verificando se a pilha está cheia\n", "\n", "A capacidade é 5 e já inserimos 5 letras. Uma nova inserção deve ser recusada.\n" ] }, { "cell_type": "code", "execution_count": 4, "id": "b390f145", "metadata": { "execution": { "iopub.execute_input": "2026-09-28T17:09:02.837153Z", "iopub.status.busy": "2026-09-28T17:09:02.836923Z", "iopub.status.idle": "2026-09-28T17:09:02.841400Z", "shell.execute_reply": "2026-09-28T17:09:02.840606Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "A pilha está cheia? True\n", "Pilha cheia. Não é possível empilhar.\n" ] } ], "source": [ "print(\"A pilha está cheia?\", pilha.esta_cheia())\n", "pilha.empilhar(\"X\")\n" ] }, { "cell_type": "markdown", "id": "92889615", "metadata": {}, "source": [ "### Consultando o topo\n", "\n", "O método `ver_topo()` retorna o elemento do topo sem removê-lo. Como o último valor empilhado foi `N`, ele deve ser retornado.\n" ] }, { "cell_type": "code", "execution_count": 5, "id": "8f5498e2", "metadata": { "execution": { "iopub.execute_input": "2026-09-28T17:09:02.843251Z", "iopub.status.busy": "2026-09-28T17:09:02.843045Z", "iopub.status.idle": "2026-09-28T17:09:02.846789Z", "shell.execute_reply": "2026-09-28T17:09:02.845621Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Elemento no topo: N\n" ] } ], "source": [ "print(\"Elemento no topo:\", pilha.ver_topo())\n" ] }, { "cell_type": "markdown", "id": "922d97bc", "metadata": {}, "source": [ "### Desempilhando elementos\n", "\n", "Cada `desempilhar()` remove o elemento do topo. Após três remoções, o topo passa a ser a letra `A`.\n" ] }, { "cell_type": "code", "execution_count": 6, "id": "ed43987b", "metadata": { "execution": { "iopub.execute_input": "2026-09-28T17:09:02.848767Z", "iopub.status.busy": "2026-09-28T17:09:02.848590Z", "iopub.status.idle": "2026-09-28T17:09:02.852684Z", "shell.execute_reply": "2026-09-28T17:09:02.851833Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Removido: N\n", "Removido: O\n", "Removido: M\n", "Elemento no topo: A\n", "R | A | \n" ] } ], "source": [ "print(\"Removido:\", pilha.desempilhar())\n", "print(\"Removido:\", pilha.desempilhar())\n", "print(\"Removido:\", pilha.desempilhar())\n", "\n", "print(\"Elemento no topo:\", pilha.ver_topo())\n", "pilha.imprimir()\n" ] }, { "cell_type": "markdown", "id": "354e6b8b", "metadata": {}, "source": [ "### Resumo\n", "\n", "- A pilha segue o princípio **LIFO**: o último a entrar é o primeiro a sair.\n", "- Sua **capacidade é fixa** e usamos `topo` para controlar a posição atual.\n", "- Só é possível acessar e remover o elemento que está no **topo**.\n", "- Empilhar e desempilhar são operações **O(1)**.\n" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.13.3" } }, "nbformat": 4, "nbformat_minor": 5 }