Desenvolva uma operação para transferir elementos de uma pilha P1 para uma pilha P2 (cópia).
Passo 1
O enunciado pede uma operação para copiar todos os elementos de uma pilha P1 para outra pilha P2, mantendo P1 intacta. O conteúdo aqui é estrutura de dados do tipo pilha (stack), e vamos usar as operações básicas push, pop e isEmpty. Para não perder os elementos de P1, vamos precisar de uma pilha auxiliar.
Passo 2
A ideia geral é esvaziar P1 para uma pilha auxiliar P_aux, assim os elementos ficam invertidos em P_aux. Em seguida, tiramos de P_aux e empilhamos de volta em P1 e, ao mesmo tempo, em P2, restaurando a ordem original em P1 e construindo a cópia em P2.
Passo 3
Primeiro, criamos P_aux vazia e, enquanto P1 não estiver vazia, fazemos pop em P1 e push em P_aux. Isso inverte a ordem dos elementos.
Depois, enquanto P_aux não estiver vazia, fazemos pop em P_aux e empilhamos o valor simultaneamente em P1 e em P2. Assim voltamos a ordem original em P1 e deixamos em P2 a mesma sequência de elementos.
Depois, enquanto P_aux não estiver vazia, fazemos pop em P_aux e empilhamos o valor simultaneamente em P1 e em P2. Assim voltamos a ordem original em P1 e deixamos em P2 a mesma sequência de elementos.
Passo 4
Com essa dupla transferência, ao final teremos P1 exatamente como começou e P2 contendo a cópia dos elementos de P1 na mesma ordem.
Resposta
Operation copiaPilha(P1, P2):
// Entradas: P1 e P2 pilhas (P2 inicialmente vazia ou com conteúdo qualquer)
// Criar pilha auxiliar
P_aux ← emptyStack()
// Entradas: P1 e P2 pilhas (P2 inicialmente vazia ou com conteúdo qualquer)
// Criar pilha auxiliar
P_aux ← emptyStack()
// Passo 1: esvaziar P1 para P_aux (inverte a ordem)
while not isEmpty(P1) do
x ← pop(P1)
push(P_aux, x)
end while
// Passo 2: esvaziar P_aux para P1 e para P2 (restaura a ordem em P1 e copia em P2)
while not isEmpty(P_aux) do
x ← pop(P_aux)
push(P1, x)
push(P2, x)
end while
// Ao final, P1 volta ao estado original e P2 tem a cópia dos elementos de P1 na mesma ordem.