Pilhas são estruturas de dados do tipo LIFO (last-in first-out), onde o último elemento a ser inserido, será o primeiro a ser retirado. Assim, uma pilha permite acesso a apenas um item de dados - o último inserido. Para processar o penúltimo item inserido, deve-se remover o último. A implementação de pilhas pode ser realizada através de vetor ou através de listas encadeadas. Numa pilha, a manipulação dos elementos é realizada em apenas uma das extremidades, chamada de topo, em oposição a outra extremidade, chamada de base. Operações Associadas: 1. criar (P) - criar uma pilha P vazia 2. inserir (x, P) - insere x no topo de P (empilha): push(x,P) 3. vazia (P) - testa se P está vazia 4. topo (P) - acessa o elemento do topo da pilha (sem eliminar) 5. elimina (P) - elimina o elemento do topo de P (desempilha): pop(P). Operações com Pilha: Todas as operações em uma pilha podem ser imaginadas como as que ocorre numa pilha de pratos em um restaurante ou como num jogo com as cartas de um baralho: • criação da pilha (); • empilhar (push) - o elemento é o parâmetro nesta operação; • desempilhar (pop); • mostrar o topo; • verificar se a pilha está vazia; • verificar se a pilha está cheia. • Verificar o tamanho atual da pilha. Uma pilha pode ser implementada de forma sequencial ou encadeada. Pilhas sequenciais • Nas pilhas sequenciais é necessário conhecer os limites da pilha: início e fim. • Os itens são armazenados em posições contíguas de memória. • Não se pode desempilhar elementos em uma pilha vazia. • Não se pode empilhar mais elementos do que o tamanho máximo definido Pilhas encadeadas • As pilhas encadeadas utilizam os mesmos conceitos de encadeamento porém a inclusão e remoção é feita somente pelo topo. • Não se pode desempilhar elementos em uma pilha vazia. No caso geral de listas ordenadas, a maior vantagem da alocação encadeada sobre a seqüencial - se a memória não for problema - é a eliminação de deslocamentos na inserção ou eliminação dos elementos. Pode-se dizer que a alocação seqüencial é mais vantajosa na maioria das vezes. As filas são estruturas de dados do tipo FIFO (first-in first-out), onde o primeiro elemento a ser inserido, será o primeiro a ser retirado, ou seja, adiciona-se itens no fim e remove- se do início. A implementação de filas pode ser realizada através de vetor ou através de listas encadeadas. uma fila tem sempre um indicador de onde começa e de onde termina. Quando queremos inserir um elemento na fila, esta operação é realizada no final da estrutura. Quando queremos remover um elemento da fila, essa operação é realizada no início da estrutura. Esses extremos são referenciados como inicio e fim de uma fila F . Se a fila F é implementada em alocação seqüencial, isto é, sobre um vetor, então esses extremos são índices desse vetor. Caso contrário, se for implementada em alocação encadeada, então esses extremos são apontadores para o primeiro e o último registros da fila. Uma fila pode ser implementada de forma sequencial ou encadeada. Filas sequenciais • Nas filas sequenciais é necessário conhecer os limites da fila: início e fim. • Os itens são armazenados em posições contíguas de memória. • Não se pode enfileirar mais elementos do que o tamanho máximo definido. Filas encadeadas • As filas encadeadas utilizam os mesmos conceitos de encadeamento porém a inclusão é sempre no fim e a remoção é feita somente pelo inicio. Operações definidas para fila: 1. Criar uma fila vazia Tem um sentido de chegada: – Fila vazia 2. Enfileirar o item no final da fila Inserindo Elementos: O elemento entra na última posição. E avança até a primeira posição disponível. 3. Desenfileirar, retorna o item do inicio da fila e o retira da fila. Não podemos remover elementos que não estejam no inicio da fila! 4. Verificar se a fila está vazia
Exemplos de uso de filas na computação:
• Filas de impressão: Impressoras tem uma fila, caso vários documentos sejam impressos, por um ou mais usuários, os primeiros documentos impressos serão de quem enviar primeiro; • Filas de processos: Vários programas podem estar sendo executados pelo sistema operacional. O mesmo tem uma fila que indica a ordem de qual será executado primeiro; • Filas de tarefas: Um programa pode ter um conjunto de dados para processar. Estes dados podem estar dispostos em uma fila, onde o que foi inserido primeiro, será atendido primeiro. Variações de Filas: • Fila de Prioridades: Cada item tem uma prioridade. Elementos mais prioritários podem ser atendidos antes, mesmo não estando no início da fila; • Fila Circular: Neste tipo de fila os elementos nem sempre são removidos ao serem atendidos, mas voltam ao fim da fila para serem atendidos novamente mais tarde.