Questão nº 35
Questão de Tecnologia da Informação · CESGRANRIO CAIXA 1/2021/NM (nº 35)
Duas pilhas, p1 e p2, foram implementadas em Python, por meio de listas em que o último elemento da lista é o topo da pilha. As configurações iniciais dessas pilhas são as seguintes:
```python
p1=[50,40,30,20,10]
p2=[ ]
```
Qual função irá transferir os elementos de p1 para p2, de modo que p1 passe a ser uma pilha vazia, e p2 passe a ter a mesma configuração que p1 tinha, antes da chamada da função?
- A
def fa(p1,p2): if(len(p1)==0): return x=p1[len(p1)-1] fa(p1,p2) p2.append(x) - B
(alternativa correta)def fb(p1,p2): if(len(p1)==0): return x=p1[len(p1)-1] del p1[len(p1)-1] fb(p1,p2) p2.append(x) - C
def fc(p1,p2): if(len(p1)==0): return p2.append(p1.pop()) fc(p1,p2) - D```python
def fd(p1,p2):
for i in range(len(p1)):
p2.append(p1.pop())
``` - E```python
def fe(p1,p2):
for i in range(len(p1)):
p2.append(p1[i])
```
Resposta comentada
Gabarito Alternativa B
Conceito-chave: Uma pilha (stack) é uma estrutura LIFO (Last In, First Out): o último elemento que entra é o primeiro que sai. Para transferir os elementos de p1 para p2 mantendo a mesma ordem, você precisa desempilhar cada elemento do topo de p1, guardá-lo temporariamente, e só depois de esvaziar p1 (via recursão ou iteração) empilhá-lo em p2 — assim o primeiro que saiu de p1 (o 10) será o último a entrar em p2, ficando no fundo, e o último que saiu (o 50) ficará no topo.
- (A) Incorreta: Não remove o elemento de
p1(falta odel), então a recursão nunca termina (loop infinito) ep1não esvazia. - (B) Correta: Remove o topo de
p1comdel, chama recursivamente atép1ficar vazio, e na volta (após a recursão) empilha cadaxemp2— isso inverte a ordem de remoção, resultando emp2=[50,40,30,20,10], exatamente a configuração original dep1. - (C) Incorreta: Usa
p2.append(p1.pop())antes da chamada recursiva, então empilha emp2na ordem de remoção (10,20,30,40,50), deixandop2invertido ([10,20,30,40,50]). - (D) Incorreta: O
for i in range(len(p1))calcula o tamanho inicial (5), mas a cadapop()olen(p1)diminui, então o loop tenta acessar índices inexistentes e para com erro (IndexError) — além de inverter a ordem. - (E) Incorreta: Apenas copia os elementos de
p1parap2sem remover nada dep1(não usapopnemdel), entãop1continua cheia ep2fica igual, mas não é uma transferência.
Armadilha do distrator mais tentador (C): A banca coloca p2.append(p1.pop()) antes da recursão, o que parece lógico (tira e coloca), mas isso inverte a ordem — o aluno que não lembra que a recursão deve acontecer antes do append cai na pegadinha, achando que a ordem se mantém, quando na verdade o 10 (topo) vai para o fundo de p2.
Fonte: CESGRANRIO CAIXA 1/2021/NM Técnico Bancário Novo - Tecnologia da Informação. Reproduzida para fins de estudo.