Logo Passei Direto
Buscar
Material
páginas com resultados encontrados.
páginas com resultados encontrados.

Prévia do material em texto

Estrutura de Dados I
Prof. Leandro Melo
CC / 2024.1
Aula 5: Pilhas e Fila
Objetivos
Aula 5: Pilhas
• Pilhas - conceito
• Pilha Sequencial
• Pilha Encadeada
• Implementações
2
3
Pilhas (Stack)
 Definição
 Pilhas são listas onde a inserção de um novo item ou a 
remoção de um item já existente se dá em uma única 
extremidade, no topo.
 É uma lista onde as operações de inserção e remoção 
são efetuadas apenas no final da lista
 LIFO (last in first out).
4
Pilhas (Stack)
 Ilustração:
Topo
Base
5
Pilhas
 Operações básicas:
empilhar (push) um novo elemento, inserindo-o 
no topo.
desempilhar (pop) um elemento, removendo-o do 
topo.
6
Pilhas
 Exemplo:
7
Pilhas
 Exemplos:
 Uma rua sem saída e estreita, onde apenas um carro passa por vez
 O último carro que entrar será o primeiro a sair
 Não podemos retirar qualquer carro
 Não podemos inserir um carro de tal forma que ele não seja o ultimo
 Uma pilha de pratos em um restaurante
 Pilha de execução na linguagem C
 Variáveis locais são empilhadas na pilha
 Ao término da função, as variáveis são desempilhadas
 Avaliação de expressões aritméticas
8
Pilhas
 Outro exemplo de uso prático:
 Recursividade ou Chamadas de procedimentos. Exemplo:
e1
e2
e1
e3
TOPO
TOPO
TOPO
TOPO
e2
e1
9
Pilhas
 Quando o procedimento A1 é executado, ele efetua uma chamada a A2, 
que deve carregar consigo o endereço de retorno e1. Ao término de A2, o 
processamento deve retornar ao A1, no devido endereço. Situação 
idêntica ocorre em A2 e A3.
 Assim, quando um procedimento termina, é o seu endereço de retorno 
que deve ser consultado. Portanto, há uma lista implícita de endereços 
(e0, e1, e2, e3) que deve ser manipulada como uma pilha pelo sistema, 
onde e0 é o endereço de retorno de A1.
 No caso de processamento recursivo - por exemplo uma chamada a A2 
dentro de A4 - o gerenciamento da lista como uma pilha resolve 
automaticamente a obtenção dos endereços de retorno na ordem 
apropriada (e0, e1, e2, e3, e4).
10
Pilhas
 Exemplos:
 Notação para expressões aritméticas:
 Infixa:
• operador entre os operandos.
• (1 – 2) * (4 + 5)
 Pósfixa:
• operador após os operandos.
• 1 2 – 4 5 + *
 Préfixa:
• operador antes dos operandos.
• * - 1 2 + 4 5
11
Pilhas
 A calculadora HP, por exemplo, utiliza a notação pósfixa.
 A avaliação de expressões aritméticas pósfixadas:
 cada operando é empilhado numa pilha de valores.
 quando se encontra um operador:
 Desempilha-se o número apropriado de operandos (dois para 
operandos binários e um para operadores unários).
 realiza-se a operação devida.
 empilha-se o resultado.
 Exemplo: avaliação da expressão (1 – 2) * (4 + 5) ou
1 2 – 4 5 + *
12
Pilhas
 Exemplo: avaliação da expressão (1 – 2) * (4 + 5) ou
1 2 – 4 5 + *
13
Pilhas
Expressão posfixa 3 9 * 8 2 / +
14
Pilhas
ESCREVA AS EXPRESSÕES NA FORMA PÓS-FIXADA
 (4 + 5) * 3 + (2 / 1)
 (4 + (3 / 1) * 2) – 5 * 3
 4 + (3 / 1) * (2 – 5) * 3
 (((4 + 3) / 1) * 2) – (5 * 3)
15
Pilhas [[()()]()]
ANALISE O CÓDIGO E DIGA O QUE ELE FAZ
int bemFormada (char s[]) 
{
criapilha ();
for (int i = 0; s[i] != '\0'; ++i) {
char c;
switch (s[i]) {
case ')': if (pilhavazia ()) return 0;
c = desempilha ();
if (c != '(') return 0;
break;
case ']': if (pilhavazia ()) return 0;
c = desempilha ();
if (c != '[') return 0;
break;
default: empilha (s[i]);
}
}
return pilhavazia ();
}
16
Pilhas
EXERCÍCIOS DE FIXAÇÃO
Neste ponto você deve realizar os
exercícios propostos no arquivo
“Aula 05 Pilhas EXERCÍCIOS”.
17
COMO PODEMOS IMPLEMENTAR UMA 
PILHA???
 Como lista Sequencial ou Encadeada?
Pilhas
18
Pilhas
 Implementação de Pilhas
 Como lista Sequencial ou Encadeada?
– 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. No caso das pilhas, essas operações de deslocamento não 
ocorrem.
– Portanto, podemos dizer que a alocação sequencial é mais vantajosa 
na maioria das vezes.
SÓ 
isso????
Pilha Sequencial
 O que precisaremos para implementar uma pilha 
sequencial?
 Um vetor de elementos
 Uma variável para controlar o topo
 Representação:
SIIIIMMM
M!!!!
Afinal, 
você que 
já 
dominou 
lista 
sequenci
al, 
agora é 
só 
repetir 

Pilha Sequencial
Precisamos 
desclocar os 
elementos na 
inserção e 
remoção?
Claro 
que não!
Pilhas
IMPLEMENTAÇÕES EM C e JAVA
•SEQUENCIAL
•ENCADEADA
21
22
Pilha Sequencial
 Operações:
 Criar uma pilha;
 Testar se a pilha está vazia;
 Testar se a pilha está cheia;
 Obter o elemento do topo (sem eliminar);
 Empilhar um novo elemento (push);
 Desempilhar o elemento do topo (pop).
 Exibir os elementos da pilha
Crie um Novo Projeto Java
• Crie um novo projeto Java chamado Pilha Sequencial;
• Crie a classe Principal contendo o método main;
• Dentro do método main, digite o seguinte código...
Classe Principal
Classe PilhaSequencial
• Crie mais uma classe no projeto. Chame-a de PilhaSequencial;
• NÃO ADICIONE O MÉTODO main!!!
A classe terá 2 variáveis de instância: 
• Um vetor de String para armazenar 100 posições, chamado “elementos”.
• Uma variável inteira para controlar o tamanho da pilha que vamos chamar de 
“topo”.
26
Pilha Sequencial
 Implementação:
27
Pilha Sequencial
 Implementação:
 Estrutura:
// Tipo base dos elementos da lista
typedef struct elementos {
char nome[50];
int num;
} t_elemento;
// Estrutura da pilha
typedef struct pilha {
t_elemento vetor[MAX];
int topo;
} t_pilha;
Aqui minha 
pilha vai 
guardar 
STRING
Aqui minha 
pilha vai 
guardar 
STRING e 
INTEIRO
28
Pilha Sequencial
 Implementação:
 Criação:
/**
* Cria uma nova pilha, aloca a sua regiao de memoria,
* inicializa o topo, e retorna a pilha criada.
* 
* @return Pilha inicializada
*/
t_pilha criar() {
t_pilha pilha;
pilha.topo = -1;
return pilha;
}
Essa 
função é o 
“construto
r” em C
Esse é o 
CONSTRUTOR do 
vetor
Inicialização 
do TOPO
29
Pilha Sequencial
 Implementação:
 Verificações:
/**
* Verifica se a pilha esta vazia ou nao.
* 
* @param pilha ponteiro para a pilha, a pilha ja deve ter sido inicializada
*
* @return Verdadeiro (1) se a pilha estiver vazia, ou falso (0) caso contrario.
*/
int isVazia(t_pilha * pilha) {
return (pilha->topo == -1);
}
30
Pilha Sequencial
 Implementação:
 Verificações:
/**
* Verifica se a pilha esta cheia ou nao.
* 
* @param pilha ponteiro para a pilha, a pilha ja deve ter sido inicializada
*
* @return Verdadeiro (1) se a pilha estiver cheia, ou falso (0) caso contrario.
*/
int isCheia(t_pilha * pilha) {
return (pilha->topo == MAX-1);
}
Por que a 
comparação 
é 
realizada 
com (length –
1) ?
OU com 
(MAX – 1) ?
31
Pilha Sequencial
 Implementação:
 Elemento do topo:
/**
* Obter o elemento do topo da pilha (sem eliminar)
* 
* @param pilha ponteiro para a pilha, a pilha ja deve ter sido inicializada
*
* @return o elemento desejado, caso a posicao seja invalida retorna vazio.
*/
t_elemento getElementoTopo(t_pilha * pilha)
{
t_elemento vazio = { "" } ;
if (isVazia(pilha))
return vazio; // erro
else
return pilha->vetor[pilha->topo];
}
Notem que o 
elemento NÃO é 
removido, apenas 
retornado para quem 
chamou a 
função/método
32
Pilha Sequencial
 Implementação:
 Desempilha:
/**
* Remove o elemento do topo da pilha (desempilhar), retornando o elemento removido
* 
* @param pilha ponteiro para a pilha, a pilha ja deve ter sido inicializada
*
* @return Uma copia do elemento do topo.
*/
t_elemento pop(t_pilha * pilha)
{
t_elemento vazio = { "" };
if (isVazia(pilha))
return vazio; // erro
else
return pilha->vetor[pilha->topo--];
}
33
Pilha Sequencial
 Implementação:
 Empilha (push):
/**
* Inserir um novo elemento no topo da pilha (empilhar)
* 
* @param pilhaponteiro para a pilha, a pilha ja deve ter sido inicializada
* @param dado elemento a ser inserido na pilha
*
* @return Falso(0) se a posição for invalida ou se a pilha estiver cheia, caso contrario, retorna Verdadeiro(1)
*/
int push(t_pilha *pilha, t_elemento valor)
{
if (isCheia(pilha))
return 0; // erro
pilha->vetor[++pilha->topo] = valor;
return 1; // sucesso
}
34
Pilha Sequencial
 Implementação:
 Exibir todos os elementos?
/**
* Exibir todos elementos da pilha
* 
* @param pilha ponteiro para a pilha, a pilha ja deve ter sido inicializada
*
*/
void exibirTudo(t_pilha *pilha)
{
}
35
Pilha Encadeada
 Implementação com nós ligados por meio de ponteiros
 As operações sob listas simplesmente encadeadas poderão 
ser tomadas como referência
 Como poderíamos adaptar uma lista simplesmente 
encadeada para uma pilha?
 Preciso modificar radicalmente a forma de programar de uma 
lista para uma pilha?
 Onde será o topo da pilha?
 No final?
 No inicio?
36
Pilha Encadeada
 Operações:
 Criar uma pilha;
 Testar se a pilha está vazia;
 Obter o elemento do topo (sem eliminar);
 Desempilhar o elemento do topo (pop).
 Empilhar um novo elemento (push);
 Exibir os elementos da pilha
 Algoritmos
37
Pilha Encadeada
 Implementação:
Estrutura:
// Tipo base dos elementos da pilha 
typedef struct elementos {
char nome[50];
char c; 
} t_elemento;
// Estrutura da pilha
typedef struct no {
t_elemento dado; // elemento contendo os dados
struct no * prox; // ponteiro para o proximo elemento
} t_no; // tipo da estrutura
// define t_pilha como sendo um outro nome para "t_no *"
typedef t_no * t_pilha;
38
Pilha Encadeada
 Implementação:
Criação:
/**
* Cria um novo no, aloca a sua regiao de memoria,
* inicializa o ponteiro prox, e retorna o ponteiro para a pilha criada.
* 
* @return No alocada e inicializada
*/
t_no * criaNo() {
t_no * no = (t_no*) malloc(sizeof(t_no));
// verifica se houve memoria suficiente para alocar
if (no)
no->prox = NULL;
return no;
}
39
Pilha Encadeada
 Implementação:
Verificações:
/**
* Verifica se a pilha esta vazia ou nao. Isto so acontece quando ela eh nula
* 
* @param pilha ponteiro para a pilha
*
* @return Verdadeiro (1) se a pilha estiver vazia, ou falso (0) caso contrario.
*/
int isVazia(t_pilha pilha) {
return (pilha == NULL);
}
40
Pilha Encadeada
 Implementação:
Elemento do topo:
/**
* Obter o elemento do topo da pilha (sem eliminar)
* 
* @param pilha ponteiro para a pilha, a pilha ja deve ter sido inicializada
*
* @return ponteiro para o elemento desejado, caso a posicao seja invalida retorna 0.
*/
t_elemento getElementoTopo(t_pilha pilha)
{
t_elemento valor = { "" };
if (isVazia(pilha))
return valor;
else
return pilha->dado;
}
41
Pilha Encadeada
 Desempilha (pop):
/**
* Remove o elemento do topo da pilha (desempilhar), retornando o elemento removido.
* 
* @param pilha ponteiro para a pilha, a pilha ja deve ter sido inicializada
*
* @return Falso(0) se a posicao for invalida ou se a pilha estiver cheia, caso contrario, retorna Verdadeiro(1)
*/
t_elemento pop(t_pilha *pilha)
{
t_no * aux;
t_elemento valor = { "" };
if (isVazia(*pilha))
return valor; // erro: pilha vazia
aux = *pilha;
valor = (*pilha)->dado;
*pilha = aux->prox;
free(aux); // libera o no que continha o dado do topo da pilha
return valor;
}
42
Pilha Encadeada
 Empilha (push):
/**
* Insere um novo elemento (dado) no topo da pilha (empilhar)
* 
* @param pilha ponteiro para a pilha
* @param dado elemento a ser inserido na pilha
*
* @return Falso(0) se a posição for invalida ou se a pilha estiver cheia, caso contrario, retorna Verdadeiro(1).
*/
int push(t_pilha *pilha, t_elemento dado)
{
t_no* novo;
novo = criaNo();
if (novo == NULL)
return 0; // erro: memoria insuficiente
novo->dado = dado;
novo->prox = *pilha;
*pilha = novo;
return 1; // sucesso
}
43
Pilha Encadeada
 Pilha Circular?
 Pilha Duplamente Encadeada?
 Faz sentido?
ATIVIDADE PARA CASA
Você está na entrada de um beco comprido, estreito e sem saída, no qual carros 
entram e saem em fila única, pois não há espaço lateral para dois carros. Neste beco 
cabem três carros. Escreva um algoritmo em C que simula as seguintes situações:
a) três carros entram no beco e seu algoritmo registra (guarda) as placas dos carros 
que entraram;
b) mostra a placa do terceiro carro que entrou;
c) três carros saem do beco e seu algoritmo mostra a placa de cada carro que saiu.
d) mostra quantos carros ficaram no beco
(*) Escolher a estrutura de dados que melhor se adequa a esta situação; implementar 
uma função para cada item (a e c); os itens b) e d) são executados no main() de seu 
algoritmo.
44
Pontos Abordados
• Conceito de Pilha
• Tipos Sequencial e Encadeada
• Implementação destas Pilhas
45
Objetivos
Aula 8: Filas
• Filas - conceito e utilização
• Fila Sequencial
• Fila Encadeada
• Fila Circular
• Implementações
46
47
Filas
 Definição
 Conjunto de itens onde as eliminações são feitas em 
uma extremidade (início da fila) e as inserções são 
realizadas na outra extremidade (final da fila).
 É uma lista linear em que a inserção é feita numa 
extremidade e a eliminação na outra.
48
Filas
 O que diferencia a fila da pilha?
 A Ordem de saída dos elementos!
 Pilha: LIFO (Last In, First Out)
 Fila: FIFO (First In, First Out)
 Lista?
 Idéia fundamental:
 Só podemos inserir um elemento no final da fila e só 
podemos retirar o elemento do início. 
49
Filas
 Analogia natural do conceito de uma fila
 Fila de um banco:
 Fila do cinema:
 Fila de atendimento:
 Quem primeiro entrar na fila, é o primeiro a ser 
atendido (a sair da fila).
Grupo de carros esperando sua vez para passar no 
pedágio
50
Filas
 Utilização na computação:
Gerenciador de impressão num ambiente multiusuário 
(impressora compartilhada)
 Tratar todas as requisições com a mesma prioridade e 
imprimir os documentos na ordem em que foram 
submetidos.
 Escalonamento de tarefas: fila de processos aguardando 
os recursos do sistema operacional.
 Fila de pacotes a serem transmitidos numa rede de 
computadores.
Multiplexação de vídeos.
51
Filas
 Ilustração:
InicioFinal
Inserir vermelho, laranja e azul
InicioFinal InicioFinal
Retirar dois elementos:
1
2
3
4
5
52
Filas
 Implementação de Filas:
Realizada a partir de uma lista com duas 
cabeças (ponteiros).
Lista Sequencial ou Encadeada ?
A implementação encadeada dinâmica 
torna mais simples as operações de inserção 
e remoção. Já a implementação seqüencial
é um pouco mais complexa (por que?), mas 
pode ser usada quando há previsão do 
tamanho máximo da fila.
53
Fila Sequencial
 O que precisaremos para montar a estrutura
de uma fila sequencial?
Um vetor de elementos
Um campo para controlar o início da fila
Outro campo para controlar o final da fila
54
Fila Sequencial
 Forma de uso:
55
Fila Sequencial
 Forma de uso (CONT.):
56
Fila Sequencial
 Problemas…
Existem cinco espaços livres na fila, mas 
nenhum outro elemento pode ser inserido
 Fila.final chegou à condição de limite (MAX -1)
Podemos chegar à situação absurda em que 
a fila está vazia, mas nenhum elemento
novo pode ser inserido.
Conclusão: A representação sequencial
descrita anteriormente não é adequada!
57
Fila Sequencial
 Solução?
Deslocar todos os elementos a cada remoção?
• Nao precisaria do índice do primeiro
elemento.
58
Fila Sequencial
 Consequência:
O método anterior é bastante ineficiente:
Cada operação envolve o deslocamento de 
cada elemento restante na fila
 Exemplo: Se uma fila contiver 1000 elementos, 
teria-se que deslocar 999 elementos para
remover um. Evidentemente seria um preço
muito alto a pagar
A operação envolve apenas a remoção de um 
único elemento. Para que envolver inúmeras
operações adicionais?
59
Fila Circular
 Solução:
Forçar finala usar o 
espaço liberado na 
frente
Para permitir a 
reutilização das posições 
já ocupadas, usa-se o 
conceito de Fila Circular
60
Fila Circular
 Fila cheia?
Quando o fim == (inicio-1) ou
Se o inicio for zero?
• Quando o fim == (MAX-1);
O ponteiro do fim não pode passar pelo do inicio;
61
Filas
 Implementação de uma fila sequencial
 Quais operações deverão ser implementadas?
 criarFila()
 isVazia()
 isCheia()
 inserir()
 remover()
 exibir()
 esvaziar()
62
Fila Sequencial
 Implementação:
 Estrutura:
// tamanho maximo da fila
#define MAX 5
// Tipo base dos elementos da fila 
typedef struct elementos {
char nome[50];
} t_elemento;
typedef struct fila {
t_elemento vetor[MAX]; // vetor que armazena a fila
int inicio; // posicao do primeiro elemento
int fim; // posicao do ultimo elemento
int quant_element; // numero de elementos da fila
} t_fila;
63
Fila Sequencial
 Implementação:
 Criação:
/**
* Cria uma nova fila, aloca a sua regiao de memoria,
* inicializa o inicio, fim e a quantidade de elementos.
* Por fim, retorna a fila criada.
*
* @return Fila inicializada
*/
t_fila criar()
{
t_fila fila;
fila.inicio = 0;
fila.fim = -1;
fila.quant_element = 0;
return fila;
}
64
Fila Sequencial
 Implementação:
 Verificações:
/**
* Verifica se a fila esta vazia ou nao.
*
* @param fila ponteiro para a fila, a fila ja deve ter sido inicializada
*
* @return Verdadeiro (1) se a fila estiver vazia, ou falso (0) caso contrario.
*/
int isVazia (t_fila * fila)
{
return (fila->quant_element == 0);
}
/**
* Verifica se a fila esta cheia ou nao.
*
* @param fila ponteiro para a fila, a fila ja deve ter sido inicializada
*
* @return Verdadeiro (1) se a fila estiver cheia, ou falso (0) caso contrario.
*/
int isCheia(t_fila * fila)
{
return (fila->quant_element == MAX);
}
65
Fila Sequencial
 Implementação:
 Inserir:
/**
* Insere um elemento (valor) no final da fila.
* 
* @param fila ponteiro para a fila, a fila ja deve ter sido inicializada
* @param valor elemento a ser inserido na fila
*
* @return Falso(0) se a fila estiver cheia, caso contrario, retorna Verdadeiro(1)
*/
int inserir (t_fila * fila, t_elemento valor)
{
if (isCheia(fila))
return 0;
(fila->quant_element)++;
fila->fim = (fila->fim + 1) % MAX;
fila->vetor[fila->fim] = valor;
return 1;
}
66
Fila Sequencial
 Implementação:
 Remover:
/**
* Remove um elemento do inicio da fila.
* 
* @param fila ponteiro para a fila, a fila ja deve ter sido inicializada
*
* @return o elemento removido.
*/
t_elemento remover(t_fila * fila)
{
t_elemento valor = { "" } ;
if (isVazia(fila))
return valor; // Erro: fila vazia
valor = fila->vetor[fila->inicio];
fila->vetor[fila->inicio].nome[0] = '\0';// zera, opcional
(fila->quant_element)--;
fila->inicio = (fila->inicio + 1) % MAX;
return valor;
}
67
Fila Sequencial
 Implementação:
 Exibição:
/**
* Exibe todos os elementos da fila
*
* @param fila ponteiro para a fila, a fila ja deve ter sido inicializada
*/
void exibir(t_fila * fila) {
int i;
if (isVazia(fila)) {
printf("Fila vazia\n");
return;
}
printf("\nExibindo fila:\n");
printf("inicio: %d\n", fila->inicio);
printf("fim: %d\n", fila->fim);
for (i=0 ; ivetor[i].nome);
}
}
68
Fila Sequencial
 Implementação:
 Exibição ordenada:
/**
* Exibe todos os elementos da fila
*
* @param fila ponteiro para a fila, a fila ja deve ter sido inicializada
*/
void mostraFila(t_fila * fila)
{
if (isVazia(fila)) {
printf("Fila vazia\n");
return;
}
for (i = fila->inicio; i != fila->fim + 1; i = (i + 1) % MAX)
printf("%d\t", fila->vetor[i]);
}
69
Fila Encadeada
 Implementação especial de uma lista
simplesmente encadeada;
 Para remover da fila, implementa-se uma
operação que retira sempre no início;
 Para inserir, implementa-se uma operação
que insere sempre no final;
70
Fila Encadeada
 Possíveis formas de Implementação:
 Lista simplesmente encadeada;
– Desvantagem: Para cada elemento inserido na fila, teremos que 
percorrer todos os nós até encontrar o último. Não é interessante!
 Lista simplesmente encadeada com dois ponteiros;
– Desvantagem: ter dois ponteiros.
 Lista simplesmente encadeada circular;
– Único ponteiro para o final da fila;
 Lista simplesmente encadeada com cabeça especial.
– Precisa-se de um único ponteiro para a cabeça especial, e, essa 
cabeça é que tem o ponteiro para o inicio e o fim.
 Lista duplamente encadeada?
71
Fila Encadeada
 Implementação:
 Lista duplamente encadeada com duas cabeças:
 Lista duplamente encadeada circular:
PRIM ULT
D
72
Fila Encadeada com Cabeça Especial
 Exemplo:
 Características
 Ponteiro para o primeiro nó;
 Ponteiro para o último nó;
 Informação sobre a quantidade de elementos da
lista.
73
Fila Encadeada com Cabeça Especial
 Implementação das operações:
criarFila()
isVazia()
inserir()
remover()
exibir()
esvaziar()
74
Fila Encadeada
 Implementação:
 Estrutura:
// Tipo base dos elementos da lista 
typedef struct elementos {
char nome[50];
} t_elemento;
typedef struct no {
t_elemento dado;
struct no * prox;
} t_no;
typedef struct fila {
t_no* inicio;
int quant_element;
t_no* final;
} t_fila;
75
Fila Encadeada
 Implementação:
 Criação:
/**
* Cria uma fila vazia, ou seja um no cabeca.
* inicializa os ponteiros ini e fim para NULL,
* e seta quant_element para zero.
* 
* @return no cabeca alocado e inicializado
*/
t_fila * criaCabeca ()
{
t_fila * fila = (t_fila*) malloc(sizeof(t_fila));
if (fila) {
fila->inicio = fila->final = NULL;
fila->quant_element=0;
}
return fila;
}
76
Fila Encadeada
 Implementação:
 Criar um nó:
/**
* Cria um novo no, aloca a sua regiao de memoria,
* inicializa o ponteiro prox, e retorna o ponteiro para a pilha criada.
* 
* @return No alocada e inicializada
*/
t_no * criaNo() {
t_no * no = (t_no*) malloc(sizeof(t_no));
// verifica se houve memoria suficiente para alocar
if (no)
no->prox = NULL;
return no;
}
77
Fila Encadeada
 Implementação:
 Verificações:
/**
* Verifica se a fila esta vazia ou nao. Isto so acontece quando ela eh nula
* 
* @param fila ponteiro para a fila
*
* @return Verdadeiro (1) se a fila estiver vazia, ou falso (0) caso contrario.
*/
int isVazia (t_fila * fila)
{
return (fila->quant_element == 0);
}
78
Fila Encadeada
 Implementação:
 Inserir:
/**
* Insere um elemento (valor) no fim da fila.
* 
* @param fila ponteiro para a fila
* @param valor elemento a ser inserido na fila
*
* @return Falso(0) se a fila estiver cheia, caso contrario, retorna Verdadeiro(1).
*/
int inserir (t_fila *fila, t_elemento valor) {
t_no *novo;
novo = criaNo();
if (novo == NULL)
return 0; // Erro: memoria insuficiente
novo->dado = valor;
if (isVazia(fila))
fila->inicio = novo;
else
(fila->final)->prox = novo;
fila->final = novo;
fila->quant_element++;
return 1;
}
79
Fila Encadeada
 Implementação:
 Remover:
/**
* Remove um elemento do inicio da fila.
* 
* @param fila ponteiro para a fila, a fila ja deve ter sido inicializada
*
* @return o elemento removido.
*/
t_elemento remover (t_fila *fila)
{
t_no *aux;
t_elemento valor = { "" } ;
if (isVazia(fila))
return valor; // Erro: fila vazia 
valor = (fila->inicio)->dado;
if (fila->inicio == fila->final)
fila->final = NULL;
aux = fila->inicio;
fila->inicio = (fila->inicio)->prox;
free(aux);
fila->quant_element--;
return valor;
}
Pontos Abordados
• Conceito de Fila
• Tipos Sequencial e Encadeada
• Implementação destas Filas
80
Estrutura de Dados I
Prof. Leandro Melo
CC / 2024.1
Aula 5: Pilhas e Fila

Mais conteúdos dessa disciplina