35 Duas pilhas, p1 e p2, foram implementadas em Python, por...
Gabarito comentado
Confira o gabarito comentado por um dos nossos professores
Alternativa Correta: B
A questão aborda o conceito de operações em pilhas na linguagem de programação Python. Pilhas (stacks) são estruturas de dados do tipo LIFO (Last In, First Out), ou seja, o último elemento a ser inserido é o primeiro a ser removido. Na linguagem Python, as pilhas podem ser facilmente implementadas com listas, usando os métodos append()
para adicionar um elemento ao topo da pilha e pop()
para remover o elemento do topo.
A resolução da questão exige um entendimento de como transferir os elementos de uma pilha para outra, conservando a ordem original dos elementos. Para isso, devemos utilizar um algoritmo que remova elementos do topo de p1
e os insira no topo de p2
. Isso deve continuar até que p1
esteja vazia.
Na alternativa B, a função fb(p1, p2)
é apresentada da seguinte forma:
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)
A função começa verificando se a pilha p1
está vazia. Se estiver, a função retorna e não faz nada. Caso contrário, o último elemento de p1
é armazenado em x
, e então removido da pilha p1
com o comando del
. Após isso, a função chama a si mesma recursivamente, transferindo os elementos restantes. Quando a execução retrocede da recursão (após atingir a condição de terminação, ou seja, p1
vazia), ela começa a adicionar os elementos armazenados em x
em p2
. Isso garante que a ordem original dos elementos é mantida.
Note que essa abordagem é recursiva e respeita a ordem original dos elementos, pois ela desmonta a pilha p1
e só começa a montar a pilha p2
na volta da recursão, mantendo assim a ordem dos elementos transferidos. Por isso, a alternativa B é a correta.
Clique para visualizar este gabarito
Visualize o gabarito desta questão clicando no botão abaixo
Comentários
Veja os comentários dos nossos alunos
a) Não estou removendo os valores de p1 + Recursão infinita porque nunca vou chegar na condição de parada
b) GAB
c) Valores de p1 ficarão na ordem inversa
d) Valores de p1 ficarão na ordem inversa
e) Não estou removendo os valores de p1
Apenas complementando,
Tanto a função del quanto a função pop removem itens de uma lista, seja ela uma Fila ou uma Pilha.
A principal diferença é que a função pop, além de remover o item da lista, retorna tal item. Já a função del não realiza o retorno do item removido.
FONTE: https://www.delftstack.com/pt/howto/python/what-is-difference-between-del-remove-and-pop-on-python-lists/
Inicialmente, a pilha p1 contém os elementos 50,40,30,20,10, logo, possuindo len(p1) > 0. Dessa forma, gostaria de tirar a seguinte dúvida: como qualquer uma das letras a,b e c podem estar corretas, se len(p1) == 0 nunca será verdadeira, antes de fazer as operações necessárias?
Kelvin,
Essa questão está aparecendo mal formatada, talvez por isso você esteja com dúvida, mas vamos lá.
Esse if serve para dar fim a recursividade que é utilizada nessas funções.
def fb(p1,p2):
if(len(p1)==0):
return
x=p1[len(p1)-1]
del p1[len(p1)-1]
fb(p1,p2) #A recursividade está aqui
p2.append(x)
Em outras palavras:
Se tamanho(p1) igual a 0:
retorna #Encerra função
Portanto só vai entrar nesse if quando p1 tiver tamanho igual a zero.
Dá um olhada na questão pela prova da cesgranrio que você vai entender melhor
https://www.cesgranrio.org.br/pdf/caixa0121/provas/caixa0121_prova_ti.pdf
a função pop remove o ultimo elemento de um array, então não pode ser nem a letra C e nem D, portanto é a letra B
Clique para visualizar este comentário
Visualize os comentários desta questão clicando no botão abaixo