Pular para o conteúdo principal

Questão de Algoritmos e Estrutura de Dados — Estrutura de Dados — UECE-CEV 2025

Algoritmos e Estrutura de DadosEstrutura de Dados
Código
qg615405
Banca
UECE-CEV
Órgão
PGE-CE
Ano
2025
Nível
Médio
Cargo
Técnico de Representação Judicial - Tecnologia da Informação - Análise e Desenvolvimento de Sistemas
Você deve implementar duas pilhas em um único array A[1…n] de modo que nenhuma das pilhas transborde, a menos que o número total de elementos nas duas pilhas juntas seja n. Considerando que as operações PUSH e POP sejam executadas em tempo O(1), assinale a opção cuja estratégia descrita permite essa implementação de forma eficiente.
  1. AUsando-se dois ponteiros, um começando no início do array para a primeira pilha e um começando no final do array para a segunda pilha, movendo-se em direção um ao outro à medida que os elementos são inseridos.
  2. BUsando-se um ponteiro no início do array para ambas as pilhas, inserindo elementos na primeira pilha e removendo da segunda pilha sempre que necessário
  3. CDividindo-se o array em duas partes iguais e atribuindo a primeira pilha à metade esquerda e a segunda pilha à metade direita. Os elementos entre as duas metades devem ser movidos conforme necessário.
  4. DUsando-se um array circular com ambas as pilhas crescendo em direções opostas e garantindo-se que os elementos sejam sempre inseridos na pilha com mais espaço disponível.
  5. EImplementando-se a primeira pilha utilizando a metade esquerda do array e a segunda pilha usando a metade direita, mas os tamanhos das pilhas podem mudar dinamicamente.
Revelar gabarito e comentário

GabaritoA — Usando-se dois ponteiros, um começando no início do array para a primeira pilha e um começando no final do array para a segunda pilha, movendo-se em direção um ao outro à medida que os elementos são inseridos.

Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.

Implementação de duas pilhas em um único array

Gabarito: letra A. A estratégia clássica para implementar duas pilhas em um único array sem desperdício de espaço é posicionar a primeira pilha no início do array (crescendo para a direita) e a segunda no final (crescendo para a esquerda), utilizando dois ponteiros que se movem em direção um ao outro. Dessa forma, o transbordo só ocorre quando o total de elementos atinge n, e as operações PUSH e POP são executadas em O(1), pois envolvem apenas a manipulação dos ponteiros.

O problema exige que nenhuma pilha transborde a menos que o array esteja completamente cheio e que PUSH/POP sejam O(1). A abordagem de duas extremidades atende perfeitamente, sendo a solução mais eficiente e amplamente conhecida.

Estratégia

Descrição

Eficiência O(1)

Transbordo só quando array cheio

Correta?

A

Dois ponteiros: um no início (pilha 1) e um no final (pilha 2), movendo-se um em direção ao outro

Sim (incremento/decremento de ponteiro)

Sim (ponteiros se cruzam apenas quando total = n)

Gabarito

B

Um ponteiro no início para ambas as pilhas, com inserção na primeira e remoção na segunda

Não (exige deslocamento/reordenação)

Não (gerenciamento inviável)

C

Divisão do array em duas metades fixas; elementos movidos entre metades conforme necessário

Não (movimentação não é O(1))

Não (desperdício de espaço)

D

Array circular com ambas as pilhas crescendo em direções opostas; insere na pilha com mais espaço

Sim (verificação O(1))

Parcial (pode não usar todo o array sem lógica extra)

E

Metade esquerda para pilha 1, metade direita para pilha 2; tamanhos mudam dinamicamente

Não (exige realocação)

Não (desperdício ou realocação)

Alternativa A — ✅ Correta ⟵ GABARITO

Usa dois ponteiros: um no início (pilha 1) e um no final (pilha 2). As pilhas crescem uma em direção à outra. Enquanto os ponteiros não se cruzarem, há espaço disponível. O transbordo ocorre apenas quando o array está cheio. PUSH e POP são O(1) (apenas incremento/decremento do ponteiro e atribuição).

Alternativa B — ❌ Incorreta

Usar um único ponteiro no início para ambas as pilhas exigiria deslocamento de elementos ou reordenação constante, o que não é O(1). Além disso, não há como gerenciar duas pilhas independentes com um só ponteiro sem custos adicionais.

Alternativa C — ❌ Incorreta

Dividir o array em duas metades fixas causa desperdício de espaço: se uma pilha crescer além da metade, a outra pilha pode ter espaço ocioso, mas não é possível usar esse espaço sem mover elementos. Mover elementos entre metades não é O(1) e quebra a eficiência.

Alternativa D — ❌ Incorreta

Um array circular com ambas as pilhas crescendo em direções opostas é complexo e a regra de “inserir na pilha com mais espaço” exige verificação a cada PUSH, o que ainda é O(1), mas a abordagem não é a mais direta e pode levar a situações em que o array não é totalmente utilizado sem lógica adicional. A solução canônica é a da alternativa A.

Alternativa E — ❌ Incorreta

Semelhante à alternativa C, mas com “tamanhos que podem mudar dinamicamente”. Na prática, isso exigiria realocar ou mover elementos quando uma pilha invade a área da outra, o que não é O(1).

Gabarito: letra A

Link permanente: /questoes/qg615405