SlideShare uma empresa Scribd logo
1 de 36
Baixar para ler offline
Pilha e Fila Dinâmica
Prof: Sergio Souza Costa
Sobre mim
Sérgio Souza Costa
Professor - UFMA
Doutor em Computação Aplicada (INPE)
prof.sergio.costa@gmail.com

https://sites.google.com/site/profsergiocosta/home
http://www.slideshare.net/skosta/presentations?order=popular
https://twitter.com/profsergiocosta
http://gplus.to/sergiosouzacosta
Pilha Dinâmica
• A pilha que codificamos anteriormente era estática,
dado que utilizava vetores.
• Agora que já codificamos a lista encadeada,
podemos utiliza-la para codificar nossa pilha
dinâmica.
• Antes de prosseguir, pense como seria este código.
Pilha Dinâmica
• A estrutura da pilha é bem simples, precisando
apenas de uma lista para armazenar os elementos.
Como a lista é dinâmica, a pilha também é dinâmica.
typedef struct {
Lista* l;
} Pilha;
Pilha dinâmica
• Agora precisamos codificar o tipo abstrato lista,
codificando as mesmas operações que foram
codificadas para a pilha estática.
–
–
–
–
–
–

Pilha* criaPilha ();
int pilhaVazia();
void empilha (Pilha *p, int x);
int desempilha();
int topo();
int pilhaCheia (Pilha *p);

Não é necessária. Por que ?
Operações da Pilha
1.
2.
3.

Alocamos a área de memória da pilha.
Inicializamos a lista da pilha com lista vazia.
Retornamos a pilha.

Pilha* criaPilha (){
1.
Pilha* p =
(Pilha*)malloc (sizeof(Pilha));
2.
p->l = Vazia();
return p;
3.
}
Operações da pilha
• Verificar se a pilha esta vazia é verificar se a lista esta
vazia.
int pilhaVazia (Pilha* p) {
return p->l == Vazia();
}
Operações da pilha
• Empilhar um elemento X na pilha é adicioná-lo na
lista.
void empilha (Pilha *p, int x) {
p->l = Cons (x, p->l);
}
Operações da pilha
• Retornar o elemento do topo é retornar o elemento
que está na cabeça da lista, ou seja, o último
adicionado.
int topo (Pilha* p) {
return primeiro(p->l);
}
Operações da pilha
• A operação desempilha, além de retornar o
elemento do topo da pilha, precisa removê-lo.
int desempilha (Pilha* p) {
int x = topo (p);
p->l = resto(p->l);
return x;
}

Remove o
elemento da
cabeça da pilha
Será que posso codificar uma fila dinâmica usando a lista
encadeada que já tenho pronta? O que vocês acham ?
A fila difere da pilha pelo fato de que na pilha inserimos e
removemos de uma mesma extremidade. Na fila eu insiro
em uma extremidade e remove em outra.
Então, preciso criar mais uma operação para a lista.
Qual seria ?
Então, preciso criar mais uma operação para a lista.
Qual seria ?
InsereFim, que irá inserir o elemento no fim da lista.
Codificando
• Adicionando a operação que insere um elemento no
fim da lista.
Lista* insereFim (int x, Lista* l) {
Lista* aux;
if (l == Vazia()) return Cons (x, l);
aux = l;
while (aux ->resto != Vazia())
aux = aux ->resto;
aux->resto = Cons (x, Vazia());
return l;
}
Codificando
• Adicionando a operação que insere um elemento no
fim da lista.
Lista* insereFim (int x, Lista* l) {
Lista* aux;
if (l == Vazia()) return Cons (x, l);
aux = l;
while (aux ->resto)
aux = aux ->resto;
aux->cauda = Cons (x, Vazia());
return l;
}

Se minha lista é
vazia, então já estou
no fim da lista.
Codificando
• Adicionando a operação que insere um elemento no
fim da lista.
Lista* insereFim (int x, Lista* l) {
Lista* aux;
if (l == Vazia()) return Cons (x, l);
aux = l;
while (aux ->resto)
aux = aux ->resto;
aux->cauda = Cons (x, Vazia());
return l;
}

Ou preciso percorrer
a lista até o fim.
Codificando
• Adicionando a operação que insere um elemento no
fim da lista.
Lista* insereFim (int x, Lista* l) {
Lista* aux;
if (l == Vazia()) return Cons (x, l);
aux = l;
while (aux ->resto)
aux = aux ->resto;
aux->resto = Cons (x, Vazia());
return l;
}

Então posso
adicioná-lo ao fim da
lista.
Não entendi muito bem, este código, ele é iterativo, os
que tinha feito até então era todos recursivo.
Vou agora usar uma
representação gráfica
comum para lista. Ela pode
te ajudar a entender este
código
L
L

5
L

5

6
L

5

6

7
L

5

6

7
L

5

6

7

Ponteiro nulo,
representa lista
vazia.
L

5

6

7

resto, é referido também como
próximo

Ponteiro nulo,
representa lista
vazia.
L

5

6

7

cauda, é eferido também como
próximo

Adicionar no fim é
adicionar um novo nó
neste ponto

Ponteiro nulo,
representa lista
vazia.
L

5

6

7

resto, referido também como
próximo

Adicionar no fim é
adicionar um novo nó
neste ponto

Ponteiro nulo,
representa lista
vazia.

Então, percorremos a lista até que o
resto seja nula, ou seja, não tenha
mais nó. Então adicionamos um novo
nó neste ponto.
L

5

6

7
Volte ao código e releiao buscando entender
melhor o seu
funcionamento antes de
prosseguir.
.
Ponteiro nulo,
representa lista
cauda, referido também como
vazia.
próximo

Adicionar no fim é
adicionar um novo nó
neste ponto

Então, percorremos a lista até que a
cauda seja nula, ou seja, não tenha
mais nó. Então adicionamos um novo
nó neste ponto.
Acho que agora já sei como codificar a fila dinâmica.
Codificando
• A estrutura vai ser similar a da pilha, apenas com um
atributo que é a lista:
typedef struct {
Lista* l;
}Fila;
Codificando
• O construtor também é similar ao da pilha.

Fila* criaFila () {
Fila* f =
(Fila*) malloc (sizeof(Fila));
f->l = Vazia();
return f;
}
Codificando
• A desenfileira é similar a desempilha.
int desenfileira (Fila* f) {
int x = primeiro (f->l);
f->l = resto (f->l);
return x;
}
Codificando
• Na enfileira chamamos a operação que insere um
elemento no fim da lista.
void enfileira (Fila* f, int x) {
f->l = insereFim(x,f->l);
}
Experimentem todos os
códigos feitos nesta aula e
as atividades postadas no
site.
Até logo !

Mais conteúdo relacionado

Mais procurados

Processamento digital de imagens com gnu octave jotacisio araujo oliveira fli...
Processamento digital de imagens com gnu octave jotacisio araujo oliveira fli...Processamento digital de imagens com gnu octave jotacisio araujo oliveira fli...
Processamento digital de imagens com gnu octave jotacisio araujo oliveira fli...PotiLivre Sobrenome
 
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2Masatoshi Tada
 
Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)Helder da Rocha
 
Programação orientada a objetos – II
Programação orientada a objetos – IIProgramação orientada a objetos – II
Programação orientada a objetos – IIGabriel Faustino
 
Estrutura de Dados - Aula 12 - Listas Duplamente Encadeadas
Estrutura de Dados  - Aula 12 - Listas Duplamente EncadeadasEstrutura de Dados  - Aula 12 - Listas Duplamente Encadeadas
Estrutura de Dados - Aula 12 - Listas Duplamente EncadeadasLeinylson Fontinele
 
Curso de WebServlets (Java EE 7)
Curso de WebServlets (Java EE 7)Curso de WebServlets (Java EE 7)
Curso de WebServlets (Java EE 7)Helder da Rocha
 
04 - C# laços de repetição, vetores e matrizes v1.0
04 - C# laços de repetição, vetores e matrizes v1.004 - C# laços de repetição, vetores e matrizes v1.0
04 - C# laços de repetição, vetores e matrizes v1.0César Augusto Pessôa
 
Estrutura de Dados - PILHAS
Estrutura de Dados - PILHASEstrutura de Dados - PILHAS
Estrutura de Dados - PILHASAparicio Junior
 
Multiple file programs, inheritance, templates
Multiple file programs, inheritance, templatesMultiple file programs, inheritance, templates
Multiple file programs, inheritance, templatesSyed Zaid Irshad
 
Exemplo de cálculo média,moda e mediana com distribuição frequencia
Exemplo de cálculo média,moda e mediana com distribuição frequenciaExemplo de cálculo média,moda e mediana com distribuição frequencia
Exemplo de cálculo média,moda e mediana com distribuição frequenciaRenato Ribeiro Soares
 
Lógica de Programação - Fluxograma
Lógica de Programação - FluxogramaLógica de Programação - Fluxograma
Lógica de Programação - FluxogramaWesley R. Bezerra
 
Java SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイルJava SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイルなおき きしだ
 
Estrutura de Dados em Java (Funções e Procedimentos)
Estrutura de Dados em Java (Funções e Procedimentos)Estrutura de Dados em Java (Funções e Procedimentos)
Estrutura de Dados em Java (Funções e Procedimentos)Adriano Teixeira de Souza
 

Mais procurados (20)

R para Iniciantes
R para IniciantesR para Iniciantes
R para Iniciantes
 
Processamento digital de imagens com gnu octave jotacisio araujo oliveira fli...
Processamento digital de imagens com gnu octave jotacisio araujo oliveira fli...Processamento digital de imagens com gnu octave jotacisio araujo oliveira fli...
Processamento digital de imagens com gnu octave jotacisio araujo oliveira fli...
 
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
 
POO - 13 - Arrays em Java
POO - 13 - Arrays em JavaPOO - 13 - Arrays em Java
POO - 13 - Arrays em Java
 
Estrutura de dados em Java - Pilhas
Estrutura de dados em Java - PilhasEstrutura de dados em Java - Pilhas
Estrutura de dados em Java - Pilhas
 
Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)
 
Programação orientada a objetos – II
Programação orientada a objetos – IIProgramação orientada a objetos – II
Programação orientada a objetos – II
 
Estrutura de Dados - Aula 12 - Listas Duplamente Encadeadas
Estrutura de Dados  - Aula 12 - Listas Duplamente EncadeadasEstrutura de Dados  - Aula 12 - Listas Duplamente Encadeadas
Estrutura de Dados - Aula 12 - Listas Duplamente Encadeadas
 
Algebra Relacional
Algebra RelacionalAlgebra Relacional
Algebra Relacional
 
Curso de WebServlets (Java EE 7)
Curso de WebServlets (Java EE 7)Curso de WebServlets (Java EE 7)
Curso de WebServlets (Java EE 7)
 
Tabela Hash
Tabela HashTabela Hash
Tabela Hash
 
04 - C# laços de repetição, vetores e matrizes v1.0
04 - C# laços de repetição, vetores e matrizes v1.004 - C# laços de repetição, vetores e matrizes v1.0
04 - C# laços de repetição, vetores e matrizes v1.0
 
Estrutura de Dados - PILHAS
Estrutura de Dados - PILHASEstrutura de Dados - PILHAS
Estrutura de Dados - PILHAS
 
Ordenação
OrdenaçãoOrdenação
Ordenação
 
Multiple file programs, inheritance, templates
Multiple file programs, inheritance, templatesMultiple file programs, inheritance, templates
Multiple file programs, inheritance, templates
 
Estrutura de dados em Java - Recursividade
Estrutura de dados em Java - RecursividadeEstrutura de dados em Java - Recursividade
Estrutura de dados em Java - Recursividade
 
Exemplo de cálculo média,moda e mediana com distribuição frequencia
Exemplo de cálculo média,moda e mediana com distribuição frequenciaExemplo de cálculo média,moda e mediana com distribuição frequencia
Exemplo de cálculo média,moda e mediana com distribuição frequencia
 
Lógica de Programação - Fluxograma
Lógica de Programação - FluxogramaLógica de Programação - Fluxograma
Lógica de Programação - Fluxograma
 
Java SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイルJava SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイル
 
Estrutura de Dados em Java (Funções e Procedimentos)
Estrutura de Dados em Java (Funções e Procedimentos)Estrutura de Dados em Java (Funções e Procedimentos)
Estrutura de Dados em Java (Funções e Procedimentos)
 

Destaque

Destaque (20)

Pilha e Fila Estática
Pilha e Fila EstáticaPilha e Fila Estática
Pilha e Fila Estática
 
Estrutura de dados - Pilhas
Estrutura de dados - PilhasEstrutura de dados - Pilhas
Estrutura de dados - Pilhas
 
Estrutura de dados em Java - Filas
Estrutura de dados em Java - FilasEstrutura de dados em Java - Filas
Estrutura de dados em Java - Filas
 
Estrutura de dados em Java - Filas com lista encadeada
Estrutura de dados em Java - Filas com lista encadeada Estrutura de dados em Java - Filas com lista encadeada
Estrutura de dados em Java - Filas com lista encadeada
 
Estrutura de dados em Java - Filas
Estrutura de dados em Java - Filas Estrutura de dados em Java - Filas
Estrutura de dados em Java - Filas
 
Estruturas de dados
Estruturas de dadosEstruturas de dados
Estruturas de dados
 
Carlos Henrique Pereira [monografia]
Carlos Henrique Pereira [monografia]Carlos Henrique Pereira [monografia]
Carlos Henrique Pereira [monografia]
 
Liderança - SENAI
Liderança - SENAILiderança - SENAI
Liderança - SENAI
 
Pged 06
Pged 06Pged 06
Pged 06
 
Estrutura de dados
Estrutura de dadosEstrutura de dados
Estrutura de dados
 
Aula03 Filas
Aula03   FilasAula03   Filas
Aula03 Filas
 
Aula02 Pilhas
Aula02   PilhasAula02   Pilhas
Aula02 Pilhas
 
Ed1
Ed1Ed1
Ed1
 
Aula01 - estrutura de dados
Aula01 - estrutura de dadosAula01 - estrutura de dados
Aula01 - estrutura de dados
 
Apostila – Curso LiderançA
Apostila – Curso LiderançAApostila – Curso LiderançA
Apostila – Curso LiderançA
 
Análise de desempenho de algoritmos de ordenação
Análise de desempenho de algoritmos de ordenaçãoAnálise de desempenho de algoritmos de ordenação
Análise de desempenho de algoritmos de ordenação
 
Pilhas e Filas
Pilhas e FilasPilhas e Filas
Pilhas e Filas
 
Apostila jsf
Apostila jsfApostila jsf
Apostila jsf
 
JavaServer Faces Produtividade em Desenvolvimento
JavaServer Faces Produtividade em DesenvolvimentoJavaServer Faces Produtividade em Desenvolvimento
JavaServer Faces Produtividade em Desenvolvimento
 
JavaServer Faces - Desenvolvendo aplicações web com produtividade
JavaServer Faces - Desenvolvendo aplicações web com produtividadeJavaServer Faces - Desenvolvendo aplicações web com produtividade
JavaServer Faces - Desenvolvendo aplicações web com produtividade
 

Semelhante a Pilha e Fila Dinamica

Semelhante a Pilha e Fila Dinamica (20)

Usar explicação 01
Usar explicação 01Usar explicação 01
Usar explicação 01
 
Usar explicação 01
Usar explicação 01Usar explicação 01
Usar explicação 01
 
Top0
Top0Top0
Top0
 
Top0
Top0Top0
Top0
 
Lpiii dp-apostila
Lpiii dp-apostilaLpiii dp-apostila
Lpiii dp-apostila
 
Pymordida0 Semana de computação da SOCIESC - 2008/10
Pymordida0 Semana de computação da SOCIESC - 2008/10Pymordida0 Semana de computação da SOCIESC - 2008/10
Pymordida0 Semana de computação da SOCIESC - 2008/10
 
Lista de inteiros
Lista de inteirosLista de inteiros
Lista de inteiros
 
Pilhas e Filas.ppt
Pilhas e Filas.pptPilhas e Filas.ppt
Pilhas e Filas.ppt
 
Programação-Aula004
Programação-Aula004Programação-Aula004
Programação-Aula004
 
Listas Estáticas Encadeadas usando linguagem C
Listas Estáticas Encadeadas usando linguagem CListas Estáticas Encadeadas usando linguagem C
Listas Estáticas Encadeadas usando linguagem C
 
Estrutura de dados - Implementação de filas com listas
Estrutura de dados - Implementação de filas com listasEstrutura de dados - Implementação de filas com listas
Estrutura de dados - Implementação de filas com listas
 
Lista encadeada de inteiros
Lista encadeada de inteirosLista encadeada de inteiros
Lista encadeada de inteiros
 
Haskell
HaskellHaskell
Haskell
 
Fugindo para as colinas com Python - Julio Biason - Tchelinux Bento Gonçalves...
Fugindo para as colinas com Python - Julio Biason - Tchelinux Bento Gonçalves...Fugindo para as colinas com Python - Julio Biason - Tchelinux Bento Gonçalves...
Fugindo para as colinas com Python - Julio Biason - Tchelinux Bento Gonçalves...
 
Programação funcional
Programação funcionalProgramação funcional
Programação funcional
 
Pged 04
Pged 04Pged 04
Pged 04
 
Aula 07 - lista linear
Aula 07 - lista linearAula 07 - lista linear
Aula 07 - lista linear
 
Skip List
Skip ListSkip List
Skip List
 
Listas em C
Listas em CListas em C
Listas em C
 
Linguagem lua
Linguagem luaLinguagem lua
Linguagem lua
 

Mais de Sérgio Souza Costa

Expressões aritméticas, relacionais e lógicas
Expressões aritméticas, relacionais e lógicasExpressões aritméticas, relacionais e lógicas
Expressões aritméticas, relacionais e lógicasSérgio Souza Costa
 
De algoritmos à programas de computador
De algoritmos à programas de computadorDe algoritmos à programas de computador
De algoritmos à programas de computadorSérgio Souza Costa
 
Introdução ao pensamento computacional e aos algoritmos
Introdução ao pensamento computacional e aos algoritmosIntrodução ao pensamento computacional e aos algoritmos
Introdução ao pensamento computacional e aos algoritmosSérgio Souza Costa
 
Minicurso de introdução a banco de dados geográficos
Minicurso de introdução a banco de dados geográficosMinicurso de introdução a banco de dados geográficos
Minicurso de introdução a banco de dados geográficosSérgio Souza Costa
 
Banco de dados geográfico - Aula de Encerramento
Banco de dados geográfico - Aula de EncerramentoBanco de dados geográfico - Aula de Encerramento
Banco de dados geográfico - Aula de EncerramentoSérgio Souza Costa
 
Banco de dados geográficos – Arquiteturas, banco de dados e modelagem
Banco de dados geográficos – Arquiteturas, banco de dados e modelagemBanco de dados geográficos – Arquiteturas, banco de dados e modelagem
Banco de dados geográficos – Arquiteturas, banco de dados e modelagemSérgio Souza Costa
 
Banco de dados geográficos - Aula de abertura
Banco de dados geográficos - Aula de aberturaBanco de dados geográficos - Aula de abertura
Banco de dados geográficos - Aula de aberturaSérgio Souza Costa
 
Linguagem SQL e Extensões Espacias - Introdução
Linguagem SQL e Extensões Espacias - IntroduçãoLinguagem SQL e Extensões Espacias - Introdução
Linguagem SQL e Extensões Espacias - IntroduçãoSérgio Souza Costa
 
Gödel’s incompleteness theorems
Gödel’s incompleteness theoremsGödel’s incompleteness theorems
Gödel’s incompleteness theoremsSérgio Souza Costa
 
DBCells - an open and global multi-scale linked cells
DBCells - an open and global multi-scale linked cellsDBCells - an open and global multi-scale linked cells
DBCells - an open and global multi-scale linked cellsSérgio Souza Costa
 
Conceitos básicos de orientação a objetos
Conceitos básicos de orientação a objetosConceitos básicos de orientação a objetos
Conceitos básicos de orientação a objetosSérgio Souza Costa
 
Polymorphism (Ad-hoc and Universal)
Polymorphism (Ad-hoc and Universal)Polymorphism (Ad-hoc and Universal)
Polymorphism (Ad-hoc and Universal)Sérgio Souza Costa
 
Relações (composição e agregação)
Relações (composição e agregação)Relações (composição e agregação)
Relações (composição e agregação)Sérgio Souza Costa
 

Mais de Sérgio Souza Costa (20)

Expressões aritméticas, relacionais e lógicas
Expressões aritméticas, relacionais e lógicasExpressões aritméticas, relacionais e lógicas
Expressões aritméticas, relacionais e lógicas
 
De algoritmos à programas de computador
De algoritmos à programas de computadorDe algoritmos à programas de computador
De algoritmos à programas de computador
 
Introdução ao pensamento computacional e aos algoritmos
Introdução ao pensamento computacional e aos algoritmosIntrodução ao pensamento computacional e aos algoritmos
Introdução ao pensamento computacional e aos algoritmos
 
Minicurso de introdução a banco de dados geográficos
Minicurso de introdução a banco de dados geográficosMinicurso de introdução a banco de dados geográficos
Minicurso de introdução a banco de dados geográficos
 
Modelagem de dados geográficos
Modelagem de dados geográficosModelagem de dados geográficos
Modelagem de dados geográficos
 
Banco de dados geográfico - Aula de Encerramento
Banco de dados geográfico - Aula de EncerramentoBanco de dados geográfico - Aula de Encerramento
Banco de dados geográfico - Aula de Encerramento
 
Banco de dados geográficos – Arquiteturas, banco de dados e modelagem
Banco de dados geográficos – Arquiteturas, banco de dados e modelagemBanco de dados geográficos – Arquiteturas, banco de dados e modelagem
Banco de dados geográficos – Arquiteturas, banco de dados e modelagem
 
Banco de dados geográficos - Aula de abertura
Banco de dados geográficos - Aula de aberturaBanco de dados geográficos - Aula de abertura
Banco de dados geográficos - Aula de abertura
 
Linguagem SQL e Extensões Espacias - Introdução
Linguagem SQL e Extensões Espacias - IntroduçãoLinguagem SQL e Extensões Espacias - Introdução
Linguagem SQL e Extensões Espacias - Introdução
 
Gödel’s incompleteness theorems
Gödel’s incompleteness theoremsGödel’s incompleteness theorems
Gödel’s incompleteness theorems
 
Turing e o problema da decisão
Turing e o problema da decisãoTuring e o problema da decisão
Turing e o problema da decisão
 
DBCells - an open and global multi-scale linked cells
DBCells - an open and global multi-scale linked cellsDBCells - an open and global multi-scale linked cells
DBCells - an open and global multi-scale linked cells
 
Conceitos básicos de orientação a objetos
Conceitos básicos de orientação a objetosConceitos básicos de orientação a objetos
Conceitos básicos de orientação a objetos
 
Polymorphism (Ad-hoc and Universal)
Polymorphism (Ad-hoc and Universal)Polymorphism (Ad-hoc and Universal)
Polymorphism (Ad-hoc and Universal)
 
Herança e Encapsulamento
Herança e EncapsulamentoHerança e Encapsulamento
Herança e Encapsulamento
 
Relações (composição e agregação)
Relações (composição e agregação)Relações (composição e agregação)
Relações (composição e agregação)
 
Abstract classes and interfaces
Abstract classes and interfacesAbstract classes and interfaces
Abstract classes and interfaces
 
Introdução ao Prolog
Introdução ao PrologIntrodução ao Prolog
Introdução ao Prolog
 
Heap - Python
Heap - PythonHeap - Python
Heap - Python
 
Paradigma lógico
Paradigma lógicoParadigma lógico
Paradigma lógico
 

Pilha e Fila Dinamica

  • 1. Pilha e Fila Dinâmica Prof: Sergio Souza Costa
  • 2. Sobre mim Sérgio Souza Costa Professor - UFMA Doutor em Computação Aplicada (INPE) prof.sergio.costa@gmail.com https://sites.google.com/site/profsergiocosta/home http://www.slideshare.net/skosta/presentations?order=popular https://twitter.com/profsergiocosta http://gplus.to/sergiosouzacosta
  • 3. Pilha Dinâmica • A pilha que codificamos anteriormente era estática, dado que utilizava vetores. • Agora que já codificamos a lista encadeada, podemos utiliza-la para codificar nossa pilha dinâmica. • Antes de prosseguir, pense como seria este código.
  • 4. Pilha Dinâmica • A estrutura da pilha é bem simples, precisando apenas de uma lista para armazenar os elementos. Como a lista é dinâmica, a pilha também é dinâmica. typedef struct { Lista* l; } Pilha;
  • 5. Pilha dinâmica • Agora precisamos codificar o tipo abstrato lista, codificando as mesmas operações que foram codificadas para a pilha estática. – – – – – – Pilha* criaPilha (); int pilhaVazia(); void empilha (Pilha *p, int x); int desempilha(); int topo(); int pilhaCheia (Pilha *p); Não é necessária. Por que ?
  • 6. Operações da Pilha 1. 2. 3. Alocamos a área de memória da pilha. Inicializamos a lista da pilha com lista vazia. Retornamos a pilha. Pilha* criaPilha (){ 1. Pilha* p = (Pilha*)malloc (sizeof(Pilha)); 2. p->l = Vazia(); return p; 3. }
  • 7. Operações da pilha • Verificar se a pilha esta vazia é verificar se a lista esta vazia. int pilhaVazia (Pilha* p) { return p->l == Vazia(); }
  • 8. Operações da pilha • Empilhar um elemento X na pilha é adicioná-lo na lista. void empilha (Pilha *p, int x) { p->l = Cons (x, p->l); }
  • 9. Operações da pilha • Retornar o elemento do topo é retornar o elemento que está na cabeça da lista, ou seja, o último adicionado. int topo (Pilha* p) { return primeiro(p->l); }
  • 10. Operações da pilha • A operação desempilha, além de retornar o elemento do topo da pilha, precisa removê-lo. int desempilha (Pilha* p) { int x = topo (p); p->l = resto(p->l); return x; } Remove o elemento da cabeça da pilha
  • 11. Será que posso codificar uma fila dinâmica usando a lista encadeada que já tenho pronta? O que vocês acham ?
  • 12. A fila difere da pilha pelo fato de que na pilha inserimos e removemos de uma mesma extremidade. Na fila eu insiro em uma extremidade e remove em outra.
  • 13. Então, preciso criar mais uma operação para a lista. Qual seria ?
  • 14. Então, preciso criar mais uma operação para a lista. Qual seria ? InsereFim, que irá inserir o elemento no fim da lista.
  • 15. Codificando • Adicionando a operação que insere um elemento no fim da lista. Lista* insereFim (int x, Lista* l) { Lista* aux; if (l == Vazia()) return Cons (x, l); aux = l; while (aux ->resto != Vazia()) aux = aux ->resto; aux->resto = Cons (x, Vazia()); return l; }
  • 16. Codificando • Adicionando a operação que insere um elemento no fim da lista. Lista* insereFim (int x, Lista* l) { Lista* aux; if (l == Vazia()) return Cons (x, l); aux = l; while (aux ->resto) aux = aux ->resto; aux->cauda = Cons (x, Vazia()); return l; } Se minha lista é vazia, então já estou no fim da lista.
  • 17. Codificando • Adicionando a operação que insere um elemento no fim da lista. Lista* insereFim (int x, Lista* l) { Lista* aux; if (l == Vazia()) return Cons (x, l); aux = l; while (aux ->resto) aux = aux ->resto; aux->cauda = Cons (x, Vazia()); return l; } Ou preciso percorrer a lista até o fim.
  • 18. Codificando • Adicionando a operação que insere um elemento no fim da lista. Lista* insereFim (int x, Lista* l) { Lista* aux; if (l == Vazia()) return Cons (x, l); aux = l; while (aux ->resto) aux = aux ->resto; aux->resto = Cons (x, Vazia()); return l; } Então posso adicioná-lo ao fim da lista.
  • 19. Não entendi muito bem, este código, ele é iterativo, os que tinha feito até então era todos recursivo.
  • 20. Vou agora usar uma representação gráfica comum para lista. Ela pode te ajudar a entender este código
  • 21. L
  • 22. L 5
  • 23. L 5 6
  • 27. L 5 6 7 resto, é referido também como próximo Ponteiro nulo, representa lista vazia.
  • 28. L 5 6 7 cauda, é eferido também como próximo Adicionar no fim é adicionar um novo nó neste ponto Ponteiro nulo, representa lista vazia.
  • 29. L 5 6 7 resto, referido também como próximo Adicionar no fim é adicionar um novo nó neste ponto Ponteiro nulo, representa lista vazia. Então, percorremos a lista até que o resto seja nula, ou seja, não tenha mais nó. Então adicionamos um novo nó neste ponto.
  • 30. L 5 6 7 Volte ao código e releiao buscando entender melhor o seu funcionamento antes de prosseguir. . Ponteiro nulo, representa lista cauda, referido também como vazia. próximo Adicionar no fim é adicionar um novo nó neste ponto Então, percorremos a lista até que a cauda seja nula, ou seja, não tenha mais nó. Então adicionamos um novo nó neste ponto.
  • 31. Acho que agora já sei como codificar a fila dinâmica.
  • 32. Codificando • A estrutura vai ser similar a da pilha, apenas com um atributo que é a lista: typedef struct { Lista* l; }Fila;
  • 33. Codificando • O construtor também é similar ao da pilha. Fila* criaFila () { Fila* f = (Fila*) malloc (sizeof(Fila)); f->l = Vazia(); return f; }
  • 34. Codificando • A desenfileira é similar a desempilha. int desenfileira (Fila* f) { int x = primeiro (f->l); f->l = resto (f->l); return x; }
  • 35. Codificando • Na enfileira chamamos a operação que insere um elemento no fim da lista. void enfileira (Fila* f, int x) { f->l = insereFim(x,f->l); }
  • 36. Experimentem todos os códigos feitos nesta aula e as atividades postadas no site. Até logo !