<jupyter_start><jupyter_text>Pilhas  Introdução Pilhas são estruturas de dados largamente utilizadas nas aplicações de software. É muito utilizada quando se deseja guardar valores que serão usados em ordem reversa do que foram empilhados. As operações nas pilhas usam o conceito de LIFO (*last in first out*), ou seja, o primeiro a sair é o último que foi empilhado.Considere a pilha abaixo, implementada em Python:<jupyter_code>pilha = [1,2,3]

pilha.pop()<jupyter_output><empty_output><jupyter_text>O comando pilha.pop() basicamente tira um elemento da pilha, que foi o último a ser inserido. Pelo exemplo acima, o último elemento a entrar na pilha foi o número 3. Agora considere a pilha abaixo:<jupyter_code>notas = [10, 8, 9, 4, 7]<jupyter_output><empty_output><jupyter_text>Quando uma pilha é inicializada dessa forma, os números são empilhados pela ordem em que são definidos, ou seja| Ordem de Entrada | Número | Pilha || :---: | :---: | :---: || 1o | 10 | 10 || 2o | 8 | 10 8 || 3o | 9 | 10 8 9 || 4o | 4 | 10 8 9 4|| 5o | 7 | 10 8 9 4 7| Já a saída da pilha segue a estratégia Lifo, ou seja, o último que entrou é o primeiro a sair: | Ordem de Saída | Número | Pilha || :---: | :---: | :---: || 1o | 7 | 10 8 9 4 || 2o | 4 | 10 8 9 || 3o | 9 | 10 8 || 4o | 8 | 10|| 5o | 10 | - |  Operações de Entrada e Saída Em uma pilha, independente da linguagem de programação, existem duas operações básicas:- push: coloca na pilha- pop: tira da pilha Em Python, usa-se as seguintes funções para cada operação:- push: append()- pop: pop()Veja um exemplo abaixo para a operação de entrada (push):<jupyter_code>notas = []

# empilhando o primeiro valor
notas.append(10)

# empilhando o segundo valor
notas.append(8)

# empilhando o terceiro valor
notas.append(6)

# imprimindo a quantidade de valores da pilha
print(len(notas))<jupyter_output><empty_output><jupyter_text>Para a operação de saída (pop), vamos usar a função pop():<jupyter_code># tirar o elemento 6
notas.pop() 

# tirar o elemento 8
notas.pop() 

# tirar o elemento 10
notas.pop() 

# imprimindo a quantidade de valores da pilha
print(len(notas))<jupyter_output><empty_output><jupyter_text>Note que, se você executar a célula acima duas vezes, Python vai mostrar um erro de pilha vazia: *IndexError: pop from empty list* Você pode salvar o resultado da função pop em uma variável, ou seja, ao executar a operação pop, o valor tirado da pilha é salvo em uma variável.<jupyter_code>notas = [10, 8, 3]

nota = notas.pop()

print(nota)<jupyter_output><empty_output><jupyter_text>**Observação: Ao contrário de outras linguagens, que têm estruturas próprias para pilhas, Python implementa o conceito de pilhas na própria estrutura de listas, que é outra estrutura de dados que veremos em aulas futuras.**  Exercícios ** Ex 1: Implemente uma pilha que armazenará 3 notas **<jupyter_code># criação da pilha com 3 notas<jupyter_output><empty_output><jupyter_text>** Ex 2: Agora crie a pilha a partir de 3 valores digitados pelo usuário. Que operação (pop, push) você irá usar? **<jupyter_code># leitura de 3 notas e gravação em uma pilha<jupyter_output><empty_output><jupyter_text>** Ex 3: Faça o cálculo da média das 3 notas armazenadas. Você deve usar a operação de saída da pilha (pop) para retirar cada nota da pilha. **<jupyter_code># cálculo de média<jupyter_output><empty_output><jupyter_text>** Ex 4: O seu desafio é alterar o código do exercício anterior para usar o mínimo possível de variáveis. **<jupyter_code># implemente o mesmo exercício acima mas com o mínimo possível de variáveis.<jupyter_output><empty_output><jupyter_text>** Ex 5: Escreva um programa que imprima seu nome de maneira reversa. Use pilhas na sua implementação **<jupyter_code># dica: você pode pegar uma letra da String acessando o seu índice

nome = "Python"
letra = nome[1] 
print(letra)<jupyter_output><empty_output><jupyter_text>** Ex 6 (Adaptado de [Sedgewick - Algorithms, 4th Edition](https://algs4.cs.princeton.edu/home/)): Uma letra significa push e um asterisco significa pop na sequência seguinte. Dê a sequência de valores devolvidos pelas operações pop quando esta seqüência de operações é realizada em uma pilha LIFO inicialmente vazia.** E U V \* O \* U P \* A S S\* A \* \* \* R \* \*<jupyter_code># dica: implemente ou faça o teste de mesa (mesmo sem código)<jupyter_output><empty_output><jupyter_text>**Ex 7: Considerando o código abaixo, implemente as operações de push e pop para que a pilha inicial seja transformada na pilha "6 7 1 9 3", onde 3 representa o topo da pilha**<jupyter_code>pilha = [6,7,1,8,2]
print("Pilha Inicial:", pilha)

#implemente a partir daqui



# a saida deve ser 6 7 1 9 3
print("Pilha Final:", pilha)<jupyter_output><empty_output><jupyter_text>** Ex 8 (Adaptado de Concurso da Petrobras): Considere que:**- P1 é uma pilha com 5 posições, v(1) a v(5), na qual v(5) é o topo. - De v(1) até v(5), a pilha P1 está preenchida, respectivamente, com os símbolos Q5, Q3, Q1, Q4, Q2. - Há ainda mais duas pilhas, inicialmente vazias, P2 e P3, com o mesmo tamanho.Implemente um código em Python de modo que a pilha P1 esteja preenchida de v(5) até v(1), respectivamente, com os símbolos Q1, Q2, Q3, Q4, Q5<jupyter_code>p1 = ["Q5","Q3","Q1","Q4","Q2"]
p2 = []
p3 = []

#implemente sua solução aqui


#deve imprimir Q5, Q4, Q3, Q2, Q1
print(p1)<jupyter_output><empty_output><jupyter_text>** DESAFIO: Implemente o problema da Torre de Hanoi usando pilhas em Python. O conceito que foi dado nessa aula é suficiente para resolver o problema. Então, esforce-se primeiro para resolver o problema sem consultas externas. Lembre-se de desafiar a si próprio para ajudar na criação de novas conexões neurais e, com isso, aumentar o seu poder de raciocínio. ** Sugestão: estabeleça um tempo para si próprio para descobrir como resolver o problema em Python. Caso não consiga nesse tempo, aí sim pode buscar soluções já implementadas. Digamos que menos de 10 minutos é desistir fácil :-)<jupyter_code># implemente o desafio<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.0929188829787234, 'fraction_numerical': 0.02476728723404255, 'mean_word_length': 4.8247821878025166, 'pattern_counts': {'":': 0, '<': 57, '<?xml version=': 0, '>': 57, 'https://': 1, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '14', 'dir': 'jupyter-structured-clean-dedup', 'id': '178793', 'license': 'MIT', 'n_tokens_mistral': 2375, 'n_tokens_neox': 2232, 'n_words': 847, 'path': 'Fontes-UDF/datastructures/Pilhas.ipynb', 'repo_name': 'IgorWinMac/UDF-Material', 'size': '6016'}