35 Duas pilhas, p1 e p2, foram implementadas em Python, por...

Próximas questões
Com base no mesmo assunto
Q1845295 Programação
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: 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?
Alternativas

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