Deque
Deques são como pilhas e filas, mas suportam inserção e remoção de ambos os lados com complexidade constante.
Motivação
Os deques são como as pilhas e as filas, mas em vez de só poder adicionar e remover de um dos lados especificamente, é permitido adicionar e remover de ambas as pontas, com complexidade constante. Pela semelhança, normalmente são chamados também de filas duplamente terminadas.
Também vale notar que pilhas e filas podem servir como exemplos de deques limitados de alguma maneira e as implementações de deque podem ser usadas tranquilamente para implementação de pilhas e filhas (que é inclusive o que é feito com a solução na biblioteca collections
em Python).
Implementações
É possível implementar deques com listas encadeadas, envolvendo uma lista sequencial de todos os elementos até o valor NULL com dois ponteiros apontando para o início e para o final. A representação em deques é exatamente a mesma, onde os elementos são adicionados ou removidos pelo começo ou pelo final da lista, a fim de garantir a complexidade das operações.
Vamos conferir então como podemos implementar um deque nas linguagens suportadas por esse solucionário.
Todos os códigos aqui apresentados (inclusive os providenciados por biblioteca) dão erro ao se tentar acessar ou remover um elemento que não existe. Confira se o deque está vazio antes de tentar remover ou acessar algum elemento.
C
Aqui eu implementei a nossa pilha como uma struct, onde você precisa inicializa-la toda vez que você precisar usá-la. Eu tomei a liberdade de fazer algumas operações extras de acordo com o deque implementado na biblioteca STL do C++ (ver subseção abaixo).
C++
A biblioteca STL oferece uma implementação de deque deque<T>
pronta para ser usada, com as seguintes operações:
push_front
: insere um elemento na frente do dequepush_back
: insere um elemento atrás do dequepop_front
: remove o elemento da frente do dequepop_back
: remove o elemento de trás do dequefront
: retorna o elemento que está na frente do dequeback
: retorna o elemento que está atrás do dequesize
: retorna quantos elementos tem no dequeempty
: retorna se o deque está vazio
Para mais detalhes sobre como funciona cada operação ou sobre como instanciar um deque, veja a documentação.
A saída do programa acima será: 20 10 30
JavaScript
A implementação em JavaScript é bastante parecida com a de C, mas com a facilidade de se lidar com classes. Embora existam os métodos shift()
e unshift()
para manipulação de vetores, não tenho certeza se tais funções são feitas em complexidade O(1) e, portanto, não sei se pode configurar um uso apropriado da estrutura de dados deque.
Python
Python implementa o deque com a biblioteca collections com todas as seguintes operações:
appendleft
: insere um elemento na frente do dequeappend
: insere um elemento atrás do dequepopleft
: remove o elemento da frente do dequepop
: remove o elemento de trás do deque
Pode-se usar acessores diretamente para avaliar a posição da frente e a de trás com [0] e [-1] respectivamente. Você também pode implementar as funções front
e back
guardando o retorno do respectivo pop
e fazendo o push
equivalente de volta.
Para mais detalhes sobre como funciona cada operação ou sobre como instanciar um deque, veja a documentação.
A saída do programa acima será: 30 10 20
Problemas
1110 - Jogando Cartas ForaLast updated