SlideShare uma empresa Scribd logo
1 de 140
Baixar para ler offline
Fim

Correia transporadora

Pilha e Fila estática
Prof. Sérgio Souza Costa

Inicio
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
Pilhas

Disciplina| Professor

Um dos conceitos mais úteis na ciência da computação é o de
pilha. Nesta aula, examinaremos essa simples estrutura de
dados e verificaremos por que ela desempenha esse
proeminente papel nas áreas de programação e de linguagens
de programação.

Esta aula pode ser
vista também no
vídeo abaixo:
Pilhas
Quais operações você pode fazer
com pilhas ?
Quais operações você pode fazer
com pilhas ?

Empilhar
Quais operações você pode fazer
com pilhas ?

Empilhar
No topo
Quais operações você pode fazer
com pilhas ?

Empilhar
No topo

Desempilhar
Quais operações você pode fazer
com pilhas ?

Empilhar
No topo

Desempilhar
Do topo
Pilha: Conceito básico

(1)
Pilha: Conceito básico

empilha
(1)

(2)
Pilha: Conceito básico
empilha
empilha
(1)

(2)

(3)
Pilha: Conceito básico
empilha
empilha
empilha
(1)

(2)

(3)

(4)
Pilha: Conceito básico
empilha
empilha
empilha
(1)
Desempilha

(5)

(2)

(3)

(4)
Pilha: Conceito básico
empilha
empilha
empilha
(1)

(2)

Desempilha
empilha

(5)

(6)

(3)

(4)
Pilha: Conceito básico
empilha
empilha
empilha
(1)

(2)

Desempilha

(3)
Desempilha

empilha

(5)

(6)

(7)

(4)
Pilha: Conceito básico
empilha
empilha
empilha
(1)

(2)

Desempilha

(3)
Desempilha

empilha

(5)

(4)

Desempilha

(6)

(7)

(8)
Pilha: Conceito básico
O primeiro que entra
é o último que sai.
LIFO (do inglês, Last
In First Out) empilha

empilha
empilha

.
(1)

(2)

Desempilha

(3)
Desempilha

empilha

(5)

(4)

Desempilha

(6)

(7)

(8)
O Tipo Abstrato Pilha
O Tipo Abstrato Pilha
Ou seja, as operações que descrevem o
comportamento da Pilha.
Quais seriam estas
operações, vocês são
capazes de enumerá-las ?
1. Empilhar
1. Empilhar

2. Desempilhar
1. Empilhar
2. Desempilhar

3. Verificar o valor do
topo
1. Empilhar
2. Desempilhar
3. Verificar o valor do topo

4. Verificar se a pilha
está vazia
1. Empilhar
2. Desempilhar
3. Verificar o valor do topo
4. Verificar se a pilha está vazia

5. Cria uma Pilha
TAD: Pilha
Significado das operações (P sendo uma pilha e x
um elemento)
1.cria_pilha () - Inicializa uma pilha, retornando uma dada
pilha P
2.empilha(P,x) - Acrescenta o elemento x no topo da pilha P
(o tamanho de P aumenta)
3.desempilha (P) - Remove e retorna o elemento no topo da
pilha (o tamanho de P diminui)
4.pilha_vazia (P) - Verifica se a pilha está vazia (ou seja,
não possui nenhum elemento)
5.topo (P) – Retorna o valor que está no topo da pilha
Qual será o estado final da pilha após
estas operações ?
p = cria_pilha()
empilha (p, 10)
empilha (p, 20)
empilha (p, 30)
desempilha (p)
empilha (p,50)
desempilha (p)
desempilha (p)
empilha (p,90)
p

p = cria_pilha ()
empilha (p, 10)
empilha (p, 20)
empilha (p, 30)
desempilha (p)
empilha (p,50)
desempilha (p)
desempilha (p)
empilha (p,90)
10
p

p

p = cria_pilha ()
empilha (p, 10)
empilha (p, 20)
empilha (p, 30)
desempilha (p)
empilha (p,50)
desempilha (p)
desempilha (p)
empilha (p,90)
20
10
p

10

p

p

p = cria_pilha ()
empilha (p, 10)
empilha (p, 20)
empilha (p, 30)
desempilha (p)
empilha (p,50)
desempilha (p)
desempilha (p)
empilha (p,90)
30
20
10
p

20

10

10

p

p

p

p = cria_pilha ()
empilha (p, 10)
empilha (p, 20)
empilha (p, 30)
desempilha (p)
empilha (p,50)
desempilha (p)
desempilha (p)
empilha (p,90)
30
20

20

10
p

20

10

10

10

p

p

p

p

p = cria_pilha ()
empilha (p, 10)
empilha (p, 20)
empilha (p, 30)
desempilha (p)
empilha (p,50)
desempilha (p)
desempilha (p)
empilha (p,90)
30
20

50
20
10
p

20

10
p

20

10

10

10

p

p

p

p

p = cria_pilha ()
empilha (p, 10)
empilha (p, 20)
empilha (p, 30)
desempilha (p)
empilha (p,50)
desempilha (p)
desempilha (p)
empilha (p,90)
30
20

20

10
p

20

10

10

10

p

p

p

p

50
20

20

10

10

p

p

p = cria_pilha ()
empilha (p, 10)
empilha (p, 20)
empilha (p, 30)
desempilha (p)
empilha (p,50)
desempilha (p)
desempilha (p)
empilha (p,90)
30
20

20

10
p

20

10

10

10

p

p

p

p

50
20

20

10

10

10

p

p

p

p = cria_pilha ()
empilha (p, 10)
empilha (p, 20)
empilha (p, 30)
desempilha (p)
empilha (p,50)
desempilha (p)
desempilha (p)
empilha (p,90)
30
20

20

10
p

20

10

10

10

p

p

p

p

50
20

20

10

10

10

10

p

p

p

p

90

p = cria_pilha ()
empilha (p, 10)
empilha (p, 20)
empilha (p, 30)
desempilha (p)
empilha (p,50)
desempilha (p)
desempilha (p)
empilha (p,90)
30
20

20

10
p

20

10

10

10

p

p

p

p

50
20

20

10

10

10

10

p

p

p

p

90

p = cria_pilha ()
empilha (p, 10)
empilha (p, 20)
empilha (p, 30)
desempilha (p)
empilha (p,50)
desempilha (p)
desempilha (p)
empilha (p,90)
Entenderam o conceito da
pilha ?
Como podemos codificar
esta estrutura ?
Que elementos podemos
usar ?
Vídeo Aula
Esta aula pode ser vista também no vídeo
abaixo:
TAD: Pilha
Uma possibilidade é usar vetores, dados que estes
permitem armazenar uma coleção de dados.
TAD: Pilha
Uma possibilidade é usar vetores, dados que estes
permitem armazenar uma coleção de dados.
Uma pilha que usa vetor como estrutura básica é
chamada de pilha estática.
TAD: Pilha
Uma possibilidade é usar vetores, dados que estes
permitem armazenar uma coleção de dados.
Uma pilha que usa vetor como estrutura básica é
chamada de pilha estática.
Na Unidade II, veremos como codificar uma pilha
dinâmica usando listas encadeadas.
Codificando o TAD Pilha
•Antes de prosseguir, pause a aula e tentem rascunhar
em papel como seria as operações:
–Empilha e
–Desempilha
Codificando o TAD Pilha
•Ao usar um vetor como estrutura para a nossa pilha
precisamos:
–Saber em qual posição do vetor o elemento deve ser
empilhado.
–Saber quando a pilha encheu, ou seja, precisaremos de
uma operação que verifica se a pilha encheu.
Codificando o TAD Pilha
•O que vamos precisar para codificar a nossa pilha?
Codificando o TAD Pilha
•O que vamos precisar para codificar a nossa pilha?

Registros
Codificando o TAD Pilha
•O que vamos precisar para codificar a nossa pilha?

Registros

Funções
Codificando o TAD Pilha
•O que vamos precisar para codificar a nossa pilha?

Registros

Funções

Ponteiros
Codificando o TAD Pilha
•O que vamos precisar para codificar a nossa pilha?

Registros

Funções

Alocação Dinâmica

Ponteiros
Codificando o TAD Pilha
Criando o tipo de dado Pilha ...

typedef struct
} Pilha;

{

Esta é a sintaxe básica
para criar qualquer tipo de
dado. Mas o que uma
pilha irá ter ?

.
Codificando o TAD Pilha
Criando o tipo de dado Pilha ...

typedef struct
int v[10];
} Pilha;

{

Um vetor v com um
dado tamanho para
armazenar os dados.
Codificando o TAD Pilha
Criando o tipo de dado Pilha ...

#define MAX 10
typedef struct {
int v[MAX];
} Pilha;

Porém, usamos uma
constante para definir o
tamanho do vetor. Por
que ?
Codificando o TAD Pilha
Criando o tipo de dado Pilha ...

#define MAX 10
typedef struct {
int v[MAX];
int topo;
} Pilha;

Precisamos ainda saber
em qual posicão inserir,
para isso usamos o
atributo topo
Codificando o TAD Pilha
Codificando as operações:
Pilha* criaPilha (){
Pilha* p = (Pilha*)
malloc (sizeof(Pilha));
p->topo = 0;
return p;
}
Codificando o TAD Pilha
Codificando as operações:
// verifica se a pilha está cheia
int pilhaCheia (Pilha *p) {
return (p->topo == MAX);
}
// verifica se está vazia
int pilhaVazia (Pilha* p) {
return p->topo == 0;
}
Codificando o TAD Pilha
Codificando as operações:
void empilha (Pilha *p, int x) {
p->v[p->topo++] = x;
}
int desempilha (Pilha* p) {
return p->v[--p->topo];
}
// retorna o elemento do topo, sem desempilhar
int topo (Pilha* p) {
return p->v[p->topo-1];
}
Codificando o TAD Pilha
Codificando as operações:
void empilha (Pilha *p, int x) {
p->v[p->topo++] = x;
}
int desempilha (Pilha* p) {
return p->v[--p->topo];
}
// retorna o elemento do topo, sem desempilhar
int topo (Pilha* p) {
return p->v[p->topo-1];
}
Codificando o TAD Pilha
Codificando as operações:
void empilha (Pilha *p, int x) {
void empilha (Pilha *p, int x) {
p->v[p->topo] = x;
p->v[p->topo++] = x;
p->topo++;
}
}
int desempilha (Pilha* p) {
return p->v[--p->topo];
}
// retorna o elemento do topo, sem desempilhar
int topo (Pilha* p) {
return p->v[p->topo-1];
}
Codificando o TAD Pilha
Codificando as operações:
void empilha (Pilha *p, int x) {
p->v[p->topo++] = x;
}
int desempilha (Pilha* p) {
return p->v[--p->topo];
}
// retorna o elemento do topo, sem desempilhar
int topo (Pilha* p) {
return p->v[p->topo-1];
}
Codificando o TAD Pilha
Codificando as operações:
void empilha (Pilha *p, int x) {
p->v[p->topo++] = x;
}
void desempilha (Pilha *) {
p->topo--;
int desempilhareturn p->v[p->topo];
(Pilha* p) {
return p->v[--p->topo];
}
}
// retorna o elemento do topo, sem desempilhar
int topo (Pilha* p) {
return p->v[p->topo-1];
}
Codificando o TAD Pilha
Codificando as operações:
void empilha (Pilha *p, int x) {
p->v[p->topo++] = x;
}
int desempilha (Pilha* p) {
return p->v[--p->topo];
}
// retorna o elemento do topo, sem desempilhar
int topo (Pilha* p) {
return p->v[p->topo-1];
}
Codificando o TAD Pilha
•Aplicação Cliente: Testando nossa pilha:
– O que será impresso ?
int main () {
Pilha* p = criaPilha ();
empilha (p, 10);
empilha (p, 30);
empilha (p, 40);
printf ("%dn", desempilha (p));
printf ("%dn", desempilha (p));
printf ("%dn", desempilha (p));
}
APLICAÇÕES
Aplicações
•Como o uso das pilhas é possivel simplificar diversos
algoritmos.
–O próprio sistema operacional utiliza pilha para tratar as
chamadas a funções.
–Uma outra aplicação comum é na avaliação de
expressões e de parênteses.
Identificando palíndromos
• Palíndromos são palavras ou frases que são iguais
quando lidas de frente para trás
• Exemplos:
ANA
ARARA
ROTOR
SOCORRAM ME SUBI NO ONIBUS EM MARROCOS (não considerando os espaços
em branco)
Identificando palíndromos
• Algoritmo
1. Empilhe n/2 letras
2. Descarta letra central se houver
3. Repita
1. Compare o topo da pilha com a proxima letra
2. Se são iguais entao Desempilhe
3. Senao Não é um palíndromo
4. Se no final a pilha está vazia entao a palavra é um
palíndromo
Identificando palíndromos

ARARA
Topo =0
Base =1

1

2

3

4

5

6

7

8
Identificando palíndromos

ARARA
Topo =1
Base =1

A
1

2

3

4

5

Empilha letra 1

6

7

8
Identificando palíndromos

ARARA
Topo =2
Base =1

AR
1

2

3

4

5

Empilha letra 2

6

7

8
Identificando palíndromos

ARARA
Topo =2
Base =1

AR
1

2

3

4

5

6

Descarta letra central

7

8
Identificando palíndromos

ARARA
Topo =2
Base =1

AR
1

2

3

4

5

6

7

Comparar topo com próxima letra

8
Identificando palíndromos

ARARA
Topo =1
Base =1

A
1

2

3

4

5

6

7

Se são iguais então desempilhe

8
Identificando palíndromos

ARARA
Topo =1
Base =1

A
1

2

3

4

5

6

7

Comparar topo com próxima letra

8
Identificando palíndromos

ARARA
Topo =1
Base =1

1

2

3

4

5

6

7

Se são iguais então desempilhe

8
Identificando palíndromos

ARARA
Topo =1
Base =1

1

2

3

4

5

6

7

8

Se no final a pilha está vazia então é um palíndromo
Outros exemplos
•Pilhas podem ser utilizadas para verificar se os
parênteses em uma expressão está balanceado.
Exemplo:
((3+4 + (4*9) ERRO: Faltam dois parênteses fechando!

Como?
Outros exemplos
•Pilhas podem ser utilizadas para verificar se os
parênteses em uma expressão está balanceado.
Exemplo:
((3+4 + (4*9) ERRO: Faltam dois parênteses fechando!

Como?

Para cada carácter da expressão faça
•Se encontrou um “(“ empilha
•Se encontrou um “)” então
•Se a pilha estiver vazia: expressão invalida
•Caso contrario desempilhe
• Se no final pilha estiver vazia, expressão válida.
Notação Infixa - Avaliação
Operadores entre operandos.
4+6*8
Como decidir quais operadores são avaliados primeiros ?
oAbordagem usual é usar as mesmas regras da
matemática.
oCaso a precedênciaseja a mesma, avalia-se da
esquerda para direita
oParenteses tem precedência sobre todos
operadores.
Notação Polonesa
É fácil observar que devido a estas regras, o algoritmo para
avaliar expressões na notação infixa não é muito trivial.
O matemático polonês Jan Łukasiewicz criou uma notação em
torno de 1920 que elimina a necessidade de regras.
Ficou sendo conhecida como notação polonesa.
Não é muito usado na matemática convencional, mas muito
usado nas ciências da computação devido sua simplicidade.
Avaliação de expressões - Notações
Infixa: A + (B*C) / D
Posfixa (polonesa reversa): A B C * + D /
Préfixa (polonesa): + A / * B C D
Avaliação de expressões - Notações
Infixa: A + (B*C) / D
Posfixa (polonesa reversa): A B C * + D /
Préfixa (polonesa): + A / * B C D
Exemplos de uso da notação polonesa

Linguagens:
Scheme e Lisp
Algoritmo de avaliação de
expressão na notação posfixa.
Notação Posfixa
A avaliação de expressões nesta notação é a mais simples.
Percorrendo uma expressão da esquerda para direita,
sabemos que ele deve operar os dois últimos valores
encontrados (considerando que os operadores são binários,
por exemplo os aritméticos).
Notação posfixa
Considerem a seguinte expressão 7 3 + 5 *
Expressão
73+5*
3+5*
+5*

Elemento Ação
7
3

Empilhar
Empilhar

Pilha
P:[]
P:[7]
P:[3,7]

5*

+

*

5

Desempilha 3
Desempilha 7
Empilha 3+7
Empilhar

P:[7]
P:[]
P:[10]
P:[5,10]

*

Desempilha 5
P:[10]
Desempilha 10
P:[]
Empilha 5*10
P:[50]
Se a pilha tiver mais de um elemento, erro, caso contrário retorna o único
valor da pilha.
Referências Bibliográficas
•AARON, Tanenbaun. Estruturas de Dados usando C.
São Paulo: Makron Books, 1995.
•PEREIRA, Silvio. Estruturas de Dados Fundamentais.
São Paulo: Editora Erica, 1996.
•VELOSO, Paulo et al. Estruturas de Dados. Rio de
Janeiro: Editora Campus, 1983.
Vídeo Aula
Esta aula pode ser vista também no vídeo abaixo:
Fila: Conceito
Conceito base: O primeiro a entrar é o primeiro a
sair. Em Inglês (Fifo): First In Fist Out

•Fila de banco
•Fila de pacientes
•Fila do supermercado
O Tipo Abstrato Fila
O Tipo Abstrato Fila
Ou seja, as operações que descrevem o
comportamento da Fila.
Quais seriam estas
operações, são capazes de
enumerá-las ?
1. criarFila
1. criarFila
2. enfileirar
1. criarFila
2. enfileirar
3. desenfileirar
Como podemos codificar
esta estrutura ?
Quais elementos podemos
usar ?
TAD: Fila
Novamente, uma possibilidade é usar vetores, dado
que estes permitem armazenar uma coleção de dados.
Uma fila que usa vetor como estrutura básica é
chamada de fila estática.
Na Unidade III, veremos como codificar uma fila
dinâmica usando listas encadeadas.
Estava pensando, e observei que na pilha a
entrada e saída é pelo mesmo “lado”.
Porém na fila é diferente, quem chega vai
para fim da fila e sai quem está no início da
fila.
Imaginando, um trabalho em série, onde
um conjunto de peças percorre uma
correia até ela ir para empacotamento
teríamos algo assim:
Fim

Inicio

Correia transporadora

Empacotador
Quando chega um novo produto, ele é colocado
no fim da fila.

Fim

Inicio

Correia transporadora

Empacotador
Quando um produto chega ao fim do processo,
a peça anterior passa a ser o inicio da fila.

Fim

Inicio

Correia transporadora

Empacotador
Quando um produto chega ao fim do processo,
a peça anterior passa a ser o inicio da fila.

Fim

Inicio

Correia transporadora

Empacotador
Quando chega um novo produto, ele é colocado
no fim da fila.

Fim

Inicio

Correia transporadora

Empacotador
CODIFICANDO ...
TAD: Fila
Definindo o tipo de dados Fila. Observe, que tivemos
que incluir os dois atributos, que marcam o inicio e o
fim da fila.
typedef struct {
int v[MAX];
int inicio, fim;
}Fila;
TAD: Fila
Codificando as operações:
Fila* criaFila () {
Fila* q = (Fila*)
malloc (sizeof(Fila));
q->inicio = 0;
q->fim = 0;
return q;
}
Antes de codificar vou pensar um pouco.
Eu sei que quando eu enfileiro estarei
incrementando o fim e quando eu
desenfileiro eu incremento o inicio. Mas
vou simular antes de codificar.
Considerando uma fila de no máximo 3 elementos:

2
1
fim
0
q

Inicio

Fila *q = criaFila ();
enfileira (q, 10);
enfileira (q, 20);
enfileira (q, 30);
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
enfileira (q, 50);
enfileira (q, 60);
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
Considerando uma fila de no máximo 3 elementos:

2
fim

1
0

10
q

Inicio

Fila *q = criaFila ();
enfileira (q, 10);
enfileira (q, 20);
enfileira (q, 30);
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
enfileira (q, 50);
enfileira (q, 60);
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
Considerando uma fila de no máximo 3 elementos:

fim

2
1

20

0

10
q

Inicio

Fila *q = criaFila ();
enfileira (q, 10);
enfileira (q, 20);
enfileira (q, 30);
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
enfileira (q, 50);
enfileira (q, 60);
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
Considerando uma fila de no máximo 3 elementos:

fim
2

30

1

20

0

10
q

Inicio

Fila *q = criaFila ();
enfileira (q, 10);
enfileira (q, 20);
enfileira (q, 30);
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
enfileira (q, 50);
enfileira (q, 60);
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
Considerando uma fila de no máximo 3 elementos:

fim
2

30

1

20

Inicio

0
q
10

Fila *q = criaFila ();
enfileira (q, 10);
enfileira (q, 20);
enfileira (q, 30);
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
enfileira (q, 50);
enfileira (q, 60);
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
Considerando uma fila de no máximo 3 elementos:

fim
2

30

Inicio

1
0
q
10
20

Fila *q = criaFila ();
enfileira (q, 10);
enfileira (q, 20);
enfileira (q, 30);
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
enfileira (q, 50);
enfileira (q, 60);
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
Considerando uma fila de no máximo 3 elementos:

fim
2

30

Inicio

1
0
q
10
20

Fila *q = criaFila ();
enfileira (q, 10);
enfileira (q, 20);
enfileira (q, 30);
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
enfileira (q, 50);
enfileira (q, 60);
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
Considerando uma fila de no máximo 3 elementos:

fim
2

30

Inicio

1
0
q

Erro: Mesmo tendo áreas
vagas, eu nao posso mais
adicionar elemento.

Fila *q = criaFila ();
enfileira (q, 10);
enfileira (q, 20);
enfileira (q, 30);
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
enfileira (q, 50);
enfileira (q, 60);
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
TAD: Fila
Solução, vetor circular:
Depois do último
elemento, temos o
primeiro e antes do
primeiro temos o
último.

Fonte:http://www2.dc.ufscar.br/~bsi/materiais/ed/u5.html
Agora vou simular novamente, mas
considerando meu vetor circular.
Considerando uma fila de no máximo 3 elementos:

2
1
fim
0
q

Inicio

Fila *q = criaFila ();
enfileira (q, 10);
enfileira (q, 20);
enfileira (q, 30);
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
enfileira (q, 50);
enfileira (q, 60);
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
Considerando uma fila de no máximo 3 elementos:

2
fim

1
0

10
q

Inicio

Fila *q = criaFila ();
enfileira (q, 10);
enfileira (q, 20);
enfileira (q, 30);
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
enfileira (q, 50);
enfileira (q, 60);
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
Considerando uma fila de no máximo 3 elementos:

fim

2
1

20

0

10
q

Inicio

Fila *q = criaFila ();
enfileira (q, 10);
enfileira (q, 20);
enfileira (q, 30);
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
enfileira (q, 50);
enfileira (q, 60);
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
Considerando uma fila de no máximo 3 elementos:

2

30

1

20

0

10
q

Inicio
fim

Fila *q = criaFila ();
enfileira (q, 10);
enfileira (q, 20);
enfileira (q, 30);
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
enfileira (q, 50);
enfileira (q, 60);
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
Considerando uma fila de no máximo 3 elementos:

2

30

1

20

Inicio

0
q
10

fim

Fila *q = criaFila ();
enfileira (q, 10);
enfileira (q, 20);
enfileira (q, 30);
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
enfileira (q, 50);
enfileira (q, 60);
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
Considerando uma fila de no máximo 3 elementos:

2

30

Inicio

1
0
q
10
20

fim

Fila *q = criaFila ();
enfileira (q, 10);
enfileira (q, 20);
enfileira (q, 30);
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
enfileira (q, 50);
enfileira (q, 60);
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
Considerando uma fila de no máximo 3 elementos:

2

30

Inicio

1
0

50
q

10
20

fim

Fila *q = criaFila ();
enfileira (q, 10);
enfileira (q, 20);
enfileira (q, 30);
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
enfileira (q, 50);
enfileira (q, 60);
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
Considerando uma fila de no máximo 3 elementos:

2

30

1

60

0

50
q

10
20

Inicio
fim

Fila *q = criaFila ();
enfileira (q, 10);
enfileira (q, 20);
enfileira (q, 30);
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
enfileira (q, 50);
enfileira (q, 60);
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
Considerando uma fila de no máximo 3 elementos:

2
1

60

0

50
q

10
20
30

fim

Inicio

Fila *q = criaFila ();
enfileira (q, 10);
enfileira (q, 20);
enfileira (q, 30);
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
enfileira (q, 50);
enfileira (q, 60);
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
Considerando uma fila de no máximo 3 elementos:

2
1

60

0
q
10
20
30
50

fim
Inicio

Fila *q = criaFila ();
enfileira (q, 10);
enfileira (q, 20);
enfileira (q, 30);
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
enfileira (q, 50);
enfileira (q, 60);
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
Considerando uma fila de no máximo 3 elementos:

2

Inicio
fim

1
0
q
10
20
30
50
60

Fila *q = criaFila ();
enfileira (q, 10);
enfileira (q, 20);
enfileira (q, 30);
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
enfileira (q, 50);
enfileira (q, 60);
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
Codificando as operações:
void enfileira (Fila* q, int x) {
q->v[q->fim++] = x;
if (q->fim == MAX)
q->fim = 0;
}
TAD: Fila
Codificando as operações:
void enfileira (Fila* q, int x) {
q->v[q->fim++] = x;
if (q->fim == MAX)
q->fim = 0;
}
Adicionamos ao fim
da fila e
incrementamos a
variável fim.
TAD: Fila
Codificando as operações:
void enfileira (Fila* q, int x) {
q->v[q->fim++] = x;
if (q->fim == MAX)
q->fim = 0;
}
Aqui simula o vetor
circular. Se chega a
MAX, então fim
passa ser 0.
TAD: Fila
Codificando as operações:
int desenfileira(Fila* q) {
int x = q->v[q->inicio++];
if (q->inicio == MAX)
q->inicio = 0;
return x;
}

Similar ao enfileira, com a
diferença que irei remover o
elemento do inicio da fila.
TAD: Fila
Testando nossa codificação:
int main () {
Fila *q = criaFila ();
enfileira (q, 10);
enfileira (q, 20);
enfileira (q, 30);
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
enfileira (q, 40);
printf ("%dn", desenfileira(q));
printf ("%dn", desenfileira(q));
return 0;
}

O que será
impresso ?
Exemplos de Aplicação
Fila: Aplicações
•Em controle de processos
operacional, fila de processos.

no

sistema

•Em algoritmo de busca em grafo (busca em
largura).
•Algoritmo de caminho mínimo (Dijkstra).
•Algoritmo de ordenação.
Referências Bibliográficas
•AARON, Tanenbaun. Estruturas de Dados usando C.
São Paulo: Makron Books, 1995.
•PEREIRA, Silvio. Estruturas de Dados Fundamentais.
São Paulo: Editora Erica, 1996.
•VELOSO, Paulo et al. Estruturas de Dados. Rio de
Janeiro: Editora Campus, 1983.

Mais conteúdo relacionado

Mais procurados

Exercicios Filas (Queues) - Estruturas de dados e algoritmos com Java
Exercicios Filas (Queues) - Estruturas de dados e algoritmos com JavaExercicios Filas (Queues) - Estruturas de dados e algoritmos com Java
Exercicios Filas (Queues) - Estruturas de dados e algoritmos com JavaLoiane Groner
 
Estrutura de Dados - Aula 15 - Pesquisa de Dados (Árvore de Pesquisa)
Estrutura de Dados - Aula 15 - Pesquisa de Dados (Árvore de Pesquisa)Estrutura de Dados - Aula 15 - Pesquisa de Dados (Árvore de Pesquisa)
Estrutura de Dados - Aula 15 - Pesquisa de Dados (Árvore de Pesquisa)Leinylson Fontinele
 
Aula 1 - Introdução a POO
Aula 1 -  Introdução a POOAula 1 -  Introdução a POO
Aula 1 - Introdução a POODaniel Brandão
 
Estrutura de Dados - Aula 09 - Listas Simplesmente Encadeadas
Estrutura de Dados - Aula 09 - Listas Simplesmente EncadeadasEstrutura de Dados - Aula 09 - Listas Simplesmente Encadeadas
Estrutura de Dados - Aula 09 - Listas Simplesmente EncadeadasLeinylson Fontinele
 
Algoritmos e lp parte 4-vetores matrizes e registros
Algoritmos e lp parte 4-vetores matrizes e registrosAlgoritmos e lp parte 4-vetores matrizes e registros
Algoritmos e lp parte 4-vetores matrizes e registrosMauro Pereira
 
Estrutura de Dados e Algoritmos com Java #02-12: Vetores e Arrays
Estrutura de Dados e Algoritmos com Java #02-12: Vetores e ArraysEstrutura de Dados e Algoritmos com Java #02-12: Vetores e Arrays
Estrutura de Dados e Algoritmos com Java #02-12: Vetores e ArraysLoiane Groner
 
Estrutura de Dados - PILHAS
Estrutura de Dados - PILHASEstrutura de Dados - PILHAS
Estrutura de Dados - PILHASAparicio Junior
 
Estrutura de dados - Introdução a linguagem C
Estrutura de dados - Introdução a linguagem CEstrutura de dados - Introdução a linguagem C
Estrutura de dados - Introdução a linguagem CAdriano Teixeira de Souza
 
Estrutura de Dados - Aula 04 - Listas Estáticas
Estrutura de Dados - Aula 04 - Listas EstáticasEstrutura de Dados - Aula 04 - Listas Estáticas
Estrutura de Dados - Aula 04 - Listas EstáticasLeinylson Fontinele
 
Introdução a estruturas de dados em python
Introdução a estruturas de dados em pythonIntrodução a estruturas de dados em python
Introdução a estruturas de dados em pythonAlvaro Oliveira
 
Listas duplamente encadeadas
Listas duplamente encadeadasListas duplamente encadeadas
Listas duplamente encadeadasJailson Torquato
 
Pseudocódigo ou Portugol (Lógica de Programação)
Pseudocódigo ou Portugol (Lógica de Programação)Pseudocódigo ou Portugol (Lógica de Programação)
Pseudocódigo ou Portugol (Lógica de Programação)Gercélia Ramos
 
Programando em python funcoes
Programando em python   funcoesProgramando em python   funcoes
Programando em python funcoessamuelthiago
 
Estrutura de Dados - Aula de revisão de C na prática
Estrutura de Dados - Aula de revisão de C na práticaEstrutura de Dados - Aula de revisão de C na prática
Estrutura de Dados - Aula de revisão de C na práticaLeinylson Fontinele
 

Mais procurados (20)

Estrutura de dados - Filas
Estrutura de dados - FilasEstrutura de dados - Filas
Estrutura de dados - Filas
 
Exercicios Filas (Queues) - Estruturas de dados e algoritmos com Java
Exercicios Filas (Queues) - Estruturas de dados e algoritmos com JavaExercicios Filas (Queues) - Estruturas de dados e algoritmos com Java
Exercicios Filas (Queues) - Estruturas de dados e algoritmos com Java
 
Estrutura de Dados - Aula 15 - Pesquisa de Dados (Árvore de Pesquisa)
Estrutura de Dados - Aula 15 - Pesquisa de Dados (Árvore de Pesquisa)Estrutura de Dados - Aula 15 - Pesquisa de Dados (Árvore de Pesquisa)
Estrutura de Dados - Aula 15 - Pesquisa de Dados (Árvore de Pesquisa)
 
Aula 1 - Introdução a POO
Aula 1 -  Introdução a POOAula 1 -  Introdução a POO
Aula 1 - Introdução a POO
 
Tabela Hash
Tabela HashTabela Hash
Tabela Hash
 
Árvore Binária
Árvore BináriaÁrvore Binária
Árvore Binária
 
Estrutura de Dados - Aula 09 - Listas Simplesmente Encadeadas
Estrutura de Dados - Aula 09 - Listas Simplesmente EncadeadasEstrutura de Dados - Aula 09 - Listas Simplesmente Encadeadas
Estrutura de Dados - Aula 09 - Listas Simplesmente Encadeadas
 
Linguagem Go
Linguagem GoLinguagem Go
Linguagem Go
 
Algoritmos e lp parte 4-vetores matrizes e registros
Algoritmos e lp parte 4-vetores matrizes e registrosAlgoritmos e lp parte 4-vetores matrizes e registros
Algoritmos e lp parte 4-vetores matrizes e registros
 
Estrutura de Dados e Algoritmos com Java #02-12: Vetores e Arrays
Estrutura de Dados e Algoritmos com Java #02-12: Vetores e ArraysEstrutura de Dados e Algoritmos com Java #02-12: Vetores e Arrays
Estrutura de Dados e Algoritmos com Java #02-12: Vetores e Arrays
 
Estrutura de Dados - PILHAS
Estrutura de Dados - PILHASEstrutura de Dados - PILHAS
Estrutura de Dados - PILHAS
 
Estrutura de dados - Introdução a linguagem C
Estrutura de dados - Introdução a linguagem CEstrutura de dados - Introdução a linguagem C
Estrutura de dados - Introdução a linguagem C
 
Estrutura de Dados - Aula 04 - Listas Estáticas
Estrutura de Dados - Aula 04 - Listas EstáticasEstrutura de Dados - Aula 04 - Listas Estáticas
Estrutura de Dados - Aula 04 - Listas Estáticas
 
Introdução a estruturas de dados em python
Introdução a estruturas de dados em pythonIntrodução a estruturas de dados em python
Introdução a estruturas de dados em python
 
Listas duplamente encadeadas
Listas duplamente encadeadasListas duplamente encadeadas
Listas duplamente encadeadas
 
Pseudocódigo ou Portugol (Lógica de Programação)
Pseudocódigo ou Portugol (Lógica de Programação)Pseudocódigo ou Portugol (Lógica de Programação)
Pseudocódigo ou Portugol (Lógica de Programação)
 
Programando em python funcoes
Programando em python   funcoesProgramando em python   funcoes
Programando em python funcoes
 
Estrutura de dados - Pilhas
Estrutura de dados - PilhasEstrutura de dados - Pilhas
Estrutura de dados - Pilhas
 
Estrutura de Dados - Aula de revisão de C na prática
Estrutura de Dados - Aula de revisão de C na práticaEstrutura de Dados - Aula de revisão de C na prática
Estrutura de Dados - Aula de revisão de C na prática
 
Estrutura de dados em Java - Filas
Estrutura de dados em Java - FilasEstrutura de dados em Java - Filas
Estrutura de dados em Java - Filas
 

Semelhante a Pilha estática

11 tipos abstratos de dados
11   tipos abstratos de dados11   tipos abstratos de dados
11 tipos abstratos de dadosRicardo Bolanho
 
Estrutura de Dados e Algoritmos com Java #13-18: Pilhas (Stack)
Estrutura de Dados e Algoritmos com Java #13-18: Pilhas (Stack)Estrutura de Dados e Algoritmos com Java #13-18: Pilhas (Stack)
Estrutura de Dados e Algoritmos com Java #13-18: Pilhas (Stack)Loiane Groner
 
Aprendendo objective c - parte 1
Aprendendo objective c - parte 1Aprendendo objective c - parte 1
Aprendendo objective c - parte 1Alamo Saravali
 
Java - Introdução a Coleções e Generics
Java - Introdução a Coleções e GenericsJava - Introdução a Coleções e Generics
Java - Introdução a Coleções e GenericsSérgio Souza Costa
 
PL/Python: Programando em Python no PostgreSQL
PL/Python: Programando em Python no PostgreSQLPL/Python: Programando em Python no PostgreSQL
PL/Python: Programando em Python no PostgreSQLJuliano Atanazio
 
Estrutura de dados - Aula de Revisão (Linguagem C/C++, Função, Vetor, Matriz,...
Estrutura de dados - Aula de Revisão (Linguagem C/C++, Função, Vetor, Matriz,...Estrutura de dados - Aula de Revisão (Linguagem C/C++, Função, Vetor, Matriz,...
Estrutura de dados - Aula de Revisão (Linguagem C/C++, Função, Vetor, Matriz,...Leinylson Fontinele
 
Estrutura de Dados - Aula de revisão de c na prática
Estrutura de Dados - Aula de revisão de c na práticaEstrutura de Dados - Aula de revisão de c na prática
Estrutura de Dados - Aula de revisão de c na práticaLeinylson Fontinele
 
Turbinando o desenvolvimento Android com Kotlin
Turbinando o desenvolvimento Android com KotlinTurbinando o desenvolvimento Android com Kotlin
Turbinando o desenvolvimento Android com KotlinNelson Glauber Leal
 
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/10Marco Mendes
 

Semelhante a Pilha estática (20)

Pilha ad
Pilha adPilha ad
Pilha ad
 
Aula 8
Aula 8Aula 8
Aula 8
 
Pilhas java
Pilhas javaPilhas java
Pilhas java
 
11 tipos abstratos de dados
11   tipos abstratos de dados11   tipos abstratos de dados
11 tipos abstratos de dados
 
Estrutura de Dados e Algoritmos com Java #13-18: Pilhas (Stack)
Estrutura de Dados e Algoritmos com Java #13-18: Pilhas (Stack)Estrutura de Dados e Algoritmos com Java #13-18: Pilhas (Stack)
Estrutura de Dados e Algoritmos com Java #13-18: Pilhas (Stack)
 
Aula14
Aula14Aula14
Aula14
 
Aprendendo objective c - parte 1
Aprendendo objective c - parte 1Aprendendo objective c - parte 1
Aprendendo objective c - parte 1
 
Java - Introdução a Coleções e Generics
Java - Introdução a Coleções e GenericsJava - Introdução a Coleções e Generics
Java - Introdução a Coleções e Generics
 
Pilha
PilhaPilha
Pilha
 
Pged 05
Pged 05Pged 05
Pged 05
 
Pilhas e filas
Pilhas e filasPilhas e filas
Pilhas e filas
 
Estruturas
EstruturasEstruturas
Estruturas
 
PL/Python: Programando em Python no PostgreSQL
PL/Python: Programando em Python no PostgreSQLPL/Python: Programando em Python no PostgreSQL
PL/Python: Programando em Python no PostgreSQL
 
Pilha e Fila Dinamica
Pilha e Fila DinamicaPilha e Fila Dinamica
Pilha e Fila Dinamica
 
Estrutura de dados - Aula de Revisão (Linguagem C/C++, Função, Vetor, Matriz,...
Estrutura de dados - Aula de Revisão (Linguagem C/C++, Função, Vetor, Matriz,...Estrutura de dados - Aula de Revisão (Linguagem C/C++, Função, Vetor, Matriz,...
Estrutura de dados - Aula de Revisão (Linguagem C/C++, Função, Vetor, Matriz,...
 
Estrutura de Dados - Aula de revisão de c na prática
Estrutura de Dados - Aula de revisão de c na práticaEstrutura de Dados - Aula de revisão de c na prática
Estrutura de Dados - Aula de revisão de c na prática
 
9 structs e ponteiros
9   structs e ponteiros9   structs e ponteiros
9 structs e ponteiros
 
Turbinando o desenvolvimento Android com Kotlin
Turbinando o desenvolvimento Android com KotlinTurbinando o desenvolvimento Android com Kotlin
Turbinando o desenvolvimento Android com Kotlin
 
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
 
Simulador Funcional
Simulador FuncionalSimulador Funcional
Simulador Funcional
 

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 estática

  • 1. Fim Correia transporadora Pilha e Fila estática Prof. Sérgio Souza Costa Inicio
  • 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. Pilhas Disciplina| Professor Um dos conceitos mais úteis na ciência da computação é o de pilha. Nesta aula, examinaremos essa simples estrutura de dados e verificaremos por que ela desempenha esse proeminente papel nas áreas de programação e de linguagens de programação. Esta aula pode ser vista também no vídeo abaixo:
  • 5. Quais operações você pode fazer com pilhas ?
  • 6. Quais operações você pode fazer com pilhas ? Empilhar
  • 7. Quais operações você pode fazer com pilhas ? Empilhar No topo
  • 8. Quais operações você pode fazer com pilhas ? Empilhar No topo Desempilhar
  • 9. Quais operações você pode fazer com pilhas ? Empilhar No topo Desempilhar Do topo
  • 18. Pilha: Conceito básico O primeiro que entra é o último que sai. LIFO (do inglês, Last In First Out) empilha empilha empilha . (1) (2) Desempilha (3) Desempilha empilha (5) (4) Desempilha (6) (7) (8)
  • 20. O Tipo Abstrato Pilha Ou seja, as operações que descrevem o comportamento da Pilha.
  • 21. Quais seriam estas operações, vocês são capazes de enumerá-las ?
  • 24. 1. Empilhar 2. Desempilhar 3. Verificar o valor do topo
  • 25. 1. Empilhar 2. Desempilhar 3. Verificar o valor do topo 4. Verificar se a pilha está vazia
  • 26. 1. Empilhar 2. Desempilhar 3. Verificar o valor do topo 4. Verificar se a pilha está vazia 5. Cria uma Pilha
  • 27. TAD: Pilha Significado das operações (P sendo uma pilha e x um elemento) 1.cria_pilha () - Inicializa uma pilha, retornando uma dada pilha P 2.empilha(P,x) - Acrescenta o elemento x no topo da pilha P (o tamanho de P aumenta) 3.desempilha (P) - Remove e retorna o elemento no topo da pilha (o tamanho de P diminui) 4.pilha_vazia (P) - Verifica se a pilha está vazia (ou seja, não possui nenhum elemento) 5.topo (P) – Retorna o valor que está no topo da pilha
  • 28. Qual será o estado final da pilha após estas operações ? p = cria_pilha() empilha (p, 10) empilha (p, 20) empilha (p, 30) desempilha (p) empilha (p,50) desempilha (p) desempilha (p) empilha (p,90)
  • 29. p p = cria_pilha () empilha (p, 10) empilha (p, 20) empilha (p, 30) desempilha (p) empilha (p,50) desempilha (p) desempilha (p) empilha (p,90)
  • 30. 10 p p p = cria_pilha () empilha (p, 10) empilha (p, 20) empilha (p, 30) desempilha (p) empilha (p,50) desempilha (p) desempilha (p) empilha (p,90)
  • 31. 20 10 p 10 p p p = cria_pilha () empilha (p, 10) empilha (p, 20) empilha (p, 30) desempilha (p) empilha (p,50) desempilha (p) desempilha (p) empilha (p,90)
  • 32. 30 20 10 p 20 10 10 p p p p = cria_pilha () empilha (p, 10) empilha (p, 20) empilha (p, 30) desempilha (p) empilha (p,50) desempilha (p) desempilha (p) empilha (p,90)
  • 33. 30 20 20 10 p 20 10 10 10 p p p p p = cria_pilha () empilha (p, 10) empilha (p, 20) empilha (p, 30) desempilha (p) empilha (p,50) desempilha (p) desempilha (p) empilha (p,90)
  • 34. 30 20 50 20 10 p 20 10 p 20 10 10 10 p p p p p = cria_pilha () empilha (p, 10) empilha (p, 20) empilha (p, 30) desempilha (p) empilha (p,50) desempilha (p) desempilha (p) empilha (p,90)
  • 35. 30 20 20 10 p 20 10 10 10 p p p p 50 20 20 10 10 p p p = cria_pilha () empilha (p, 10) empilha (p, 20) empilha (p, 30) desempilha (p) empilha (p,50) desempilha (p) desempilha (p) empilha (p,90)
  • 36. 30 20 20 10 p 20 10 10 10 p p p p 50 20 20 10 10 10 p p p p = cria_pilha () empilha (p, 10) empilha (p, 20) empilha (p, 30) desempilha (p) empilha (p,50) desempilha (p) desempilha (p) empilha (p,90)
  • 37. 30 20 20 10 p 20 10 10 10 p p p p 50 20 20 10 10 10 10 p p p p 90 p = cria_pilha () empilha (p, 10) empilha (p, 20) empilha (p, 30) desempilha (p) empilha (p,50) desempilha (p) desempilha (p) empilha (p,90)
  • 38. 30 20 20 10 p 20 10 10 10 p p p p 50 20 20 10 10 10 10 p p p p 90 p = cria_pilha () empilha (p, 10) empilha (p, 20) empilha (p, 30) desempilha (p) empilha (p,50) desempilha (p) desempilha (p) empilha (p,90)
  • 39. Entenderam o conceito da pilha ?
  • 42. Vídeo Aula Esta aula pode ser vista também no vídeo abaixo:
  • 43. TAD: Pilha Uma possibilidade é usar vetores, dados que estes permitem armazenar uma coleção de dados.
  • 44. TAD: Pilha Uma possibilidade é usar vetores, dados que estes permitem armazenar uma coleção de dados. Uma pilha que usa vetor como estrutura básica é chamada de pilha estática.
  • 45. TAD: Pilha Uma possibilidade é usar vetores, dados que estes permitem armazenar uma coleção de dados. Uma pilha que usa vetor como estrutura básica é chamada de pilha estática. Na Unidade II, veremos como codificar uma pilha dinâmica usando listas encadeadas.
  • 46. Codificando o TAD Pilha •Antes de prosseguir, pause a aula e tentem rascunhar em papel como seria as operações: –Empilha e –Desempilha
  • 47. Codificando o TAD Pilha •Ao usar um vetor como estrutura para a nossa pilha precisamos: –Saber em qual posição do vetor o elemento deve ser empilhado. –Saber quando a pilha encheu, ou seja, precisaremos de uma operação que verifica se a pilha encheu.
  • 48. Codificando o TAD Pilha •O que vamos precisar para codificar a nossa pilha?
  • 49. Codificando o TAD Pilha •O que vamos precisar para codificar a nossa pilha? Registros
  • 50. Codificando o TAD Pilha •O que vamos precisar para codificar a nossa pilha? Registros Funções
  • 51. Codificando o TAD Pilha •O que vamos precisar para codificar a nossa pilha? Registros Funções Ponteiros
  • 52. Codificando o TAD Pilha •O que vamos precisar para codificar a nossa pilha? Registros Funções Alocação Dinâmica Ponteiros
  • 53. Codificando o TAD Pilha Criando o tipo de dado Pilha ... typedef struct } Pilha; { Esta é a sintaxe básica para criar qualquer tipo de dado. Mas o que uma pilha irá ter ? .
  • 54. Codificando o TAD Pilha Criando o tipo de dado Pilha ... typedef struct int v[10]; } Pilha; { Um vetor v com um dado tamanho para armazenar os dados.
  • 55. Codificando o TAD Pilha Criando o tipo de dado Pilha ... #define MAX 10 typedef struct { int v[MAX]; } Pilha; Porém, usamos uma constante para definir o tamanho do vetor. Por que ?
  • 56. Codificando o TAD Pilha Criando o tipo de dado Pilha ... #define MAX 10 typedef struct { int v[MAX]; int topo; } Pilha; Precisamos ainda saber em qual posicão inserir, para isso usamos o atributo topo
  • 57. Codificando o TAD Pilha Codificando as operações: Pilha* criaPilha (){ Pilha* p = (Pilha*) malloc (sizeof(Pilha)); p->topo = 0; return p; }
  • 58. Codificando o TAD Pilha Codificando as operações: // verifica se a pilha está cheia int pilhaCheia (Pilha *p) { return (p->topo == MAX); } // verifica se está vazia int pilhaVazia (Pilha* p) { return p->topo == 0; }
  • 59. Codificando o TAD Pilha Codificando as operações: void empilha (Pilha *p, int x) { p->v[p->topo++] = x; } int desempilha (Pilha* p) { return p->v[--p->topo]; } // retorna o elemento do topo, sem desempilhar int topo (Pilha* p) { return p->v[p->topo-1]; }
  • 60. Codificando o TAD Pilha Codificando as operações: void empilha (Pilha *p, int x) { p->v[p->topo++] = x; } int desempilha (Pilha* p) { return p->v[--p->topo]; } // retorna o elemento do topo, sem desempilhar int topo (Pilha* p) { return p->v[p->topo-1]; }
  • 61. Codificando o TAD Pilha Codificando as operações: void empilha (Pilha *p, int x) { void empilha (Pilha *p, int x) { p->v[p->topo] = x; p->v[p->topo++] = x; p->topo++; } } int desempilha (Pilha* p) { return p->v[--p->topo]; } // retorna o elemento do topo, sem desempilhar int topo (Pilha* p) { return p->v[p->topo-1]; }
  • 62. Codificando o TAD Pilha Codificando as operações: void empilha (Pilha *p, int x) { p->v[p->topo++] = x; } int desempilha (Pilha* p) { return p->v[--p->topo]; } // retorna o elemento do topo, sem desempilhar int topo (Pilha* p) { return p->v[p->topo-1]; }
  • 63. Codificando o TAD Pilha Codificando as operações: void empilha (Pilha *p, int x) { p->v[p->topo++] = x; } void desempilha (Pilha *) { p->topo--; int desempilhareturn p->v[p->topo]; (Pilha* p) { return p->v[--p->topo]; } } // retorna o elemento do topo, sem desempilhar int topo (Pilha* p) { return p->v[p->topo-1]; }
  • 64. Codificando o TAD Pilha Codificando as operações: void empilha (Pilha *p, int x) { p->v[p->topo++] = x; } int desempilha (Pilha* p) { return p->v[--p->topo]; } // retorna o elemento do topo, sem desempilhar int topo (Pilha* p) { return p->v[p->topo-1]; }
  • 65. Codificando o TAD Pilha •Aplicação Cliente: Testando nossa pilha: – O que será impresso ? int main () { Pilha* p = criaPilha (); empilha (p, 10); empilha (p, 30); empilha (p, 40); printf ("%dn", desempilha (p)); printf ("%dn", desempilha (p)); printf ("%dn", desempilha (p)); }
  • 67. Aplicações •Como o uso das pilhas é possivel simplificar diversos algoritmos. –O próprio sistema operacional utiliza pilha para tratar as chamadas a funções. –Uma outra aplicação comum é na avaliação de expressões e de parênteses.
  • 68. Identificando palíndromos • Palíndromos são palavras ou frases que são iguais quando lidas de frente para trás • Exemplos: ANA ARARA ROTOR SOCORRAM ME SUBI NO ONIBUS EM MARROCOS (não considerando os espaços em branco)
  • 69. Identificando palíndromos • Algoritmo 1. Empilhe n/2 letras 2. Descarta letra central se houver 3. Repita 1. Compare o topo da pilha com a proxima letra 2. Se são iguais entao Desempilhe 3. Senao Não é um palíndromo 4. Se no final a pilha está vazia entao a palavra é um palíndromo
  • 71. Identificando palíndromos ARARA Topo =1 Base =1 A 1 2 3 4 5 Empilha letra 1 6 7 8
  • 72. Identificando palíndromos ARARA Topo =2 Base =1 AR 1 2 3 4 5 Empilha letra 2 6 7 8
  • 73. Identificando palíndromos ARARA Topo =2 Base =1 AR 1 2 3 4 5 6 Descarta letra central 7 8
  • 74. Identificando palíndromos ARARA Topo =2 Base =1 AR 1 2 3 4 5 6 7 Comparar topo com próxima letra 8
  • 75. Identificando palíndromos ARARA Topo =1 Base =1 A 1 2 3 4 5 6 7 Se são iguais então desempilhe 8
  • 76. Identificando palíndromos ARARA Topo =1 Base =1 A 1 2 3 4 5 6 7 Comparar topo com próxima letra 8
  • 77. Identificando palíndromos ARARA Topo =1 Base =1 1 2 3 4 5 6 7 Se são iguais então desempilhe 8
  • 78. Identificando palíndromos ARARA Topo =1 Base =1 1 2 3 4 5 6 7 8 Se no final a pilha está vazia então é um palíndromo
  • 79. Outros exemplos •Pilhas podem ser utilizadas para verificar se os parênteses em uma expressão está balanceado. Exemplo: ((3+4 + (4*9) ERRO: Faltam dois parênteses fechando! Como?
  • 80. Outros exemplos •Pilhas podem ser utilizadas para verificar se os parênteses em uma expressão está balanceado. Exemplo: ((3+4 + (4*9) ERRO: Faltam dois parênteses fechando! Como? Para cada carácter da expressão faça •Se encontrou um “(“ empilha •Se encontrou um “)” então •Se a pilha estiver vazia: expressão invalida •Caso contrario desempilhe • Se no final pilha estiver vazia, expressão válida.
  • 81. Notação Infixa - Avaliação Operadores entre operandos. 4+6*8 Como decidir quais operadores são avaliados primeiros ? oAbordagem usual é usar as mesmas regras da matemática. oCaso a precedênciaseja a mesma, avalia-se da esquerda para direita oParenteses tem precedência sobre todos operadores.
  • 82. Notação Polonesa É fácil observar que devido a estas regras, o algoritmo para avaliar expressões na notação infixa não é muito trivial. O matemático polonês Jan Łukasiewicz criou uma notação em torno de 1920 que elimina a necessidade de regras. Ficou sendo conhecida como notação polonesa. Não é muito usado na matemática convencional, mas muito usado nas ciências da computação devido sua simplicidade.
  • 83. Avaliação de expressões - Notações Infixa: A + (B*C) / D Posfixa (polonesa reversa): A B C * + D / Préfixa (polonesa): + A / * B C D
  • 84. Avaliação de expressões - Notações Infixa: A + (B*C) / D Posfixa (polonesa reversa): A B C * + D / Préfixa (polonesa): + A / * B C D
  • 85. Exemplos de uso da notação polonesa Linguagens: Scheme e Lisp
  • 86. Algoritmo de avaliação de expressão na notação posfixa.
  • 87. Notação Posfixa A avaliação de expressões nesta notação é a mais simples. Percorrendo uma expressão da esquerda para direita, sabemos que ele deve operar os dois últimos valores encontrados (considerando que os operadores são binários, por exemplo os aritméticos).
  • 88. Notação posfixa Considerem a seguinte expressão 7 3 + 5 * Expressão 73+5* 3+5* +5* Elemento Ação 7 3 Empilhar Empilhar Pilha P:[] P:[7] P:[3,7] 5* + * 5 Desempilha 3 Desempilha 7 Empilha 3+7 Empilhar P:[7] P:[] P:[10] P:[5,10] * Desempilha 5 P:[10] Desempilha 10 P:[] Empilha 5*10 P:[50] Se a pilha tiver mais de um elemento, erro, caso contrário retorna o único valor da pilha.
  • 89. Referências Bibliográficas •AARON, Tanenbaun. Estruturas de Dados usando C. São Paulo: Makron Books, 1995. •PEREIRA, Silvio. Estruturas de Dados Fundamentais. São Paulo: Editora Erica, 1996. •VELOSO, Paulo et al. Estruturas de Dados. Rio de Janeiro: Editora Campus, 1983.
  • 90. Vídeo Aula Esta aula pode ser vista também no vídeo abaixo:
  • 91. Fila: Conceito Conceito base: O primeiro a entrar é o primeiro a sair. Em Inglês (Fifo): First In Fist Out •Fila de banco •Fila de pacientes •Fila do supermercado
  • 93. O Tipo Abstrato Fila Ou seja, as operações que descrevem o comportamento da Fila.
  • 94. Quais seriam estas operações, são capazes de enumerá-las ?
  • 100. TAD: Fila Novamente, uma possibilidade é usar vetores, dado que estes permitem armazenar uma coleção de dados. Uma fila que usa vetor como estrutura básica é chamada de fila estática. Na Unidade III, veremos como codificar uma fila dinâmica usando listas encadeadas.
  • 101. Estava pensando, e observei que na pilha a entrada e saída é pelo mesmo “lado”. Porém na fila é diferente, quem chega vai para fim da fila e sai quem está no início da fila.
  • 102. Imaginando, um trabalho em série, onde um conjunto de peças percorre uma correia até ela ir para empacotamento teríamos algo assim:
  • 104. Quando chega um novo produto, ele é colocado no fim da fila. Fim Inicio Correia transporadora Empacotador
  • 105. Quando um produto chega ao fim do processo, a peça anterior passa a ser o inicio da fila. Fim Inicio Correia transporadora Empacotador
  • 106. Quando um produto chega ao fim do processo, a peça anterior passa a ser o inicio da fila. Fim Inicio Correia transporadora Empacotador
  • 107. Quando chega um novo produto, ele é colocado no fim da fila. Fim Inicio Correia transporadora Empacotador
  • 109. TAD: Fila Definindo o tipo de dados Fila. Observe, que tivemos que incluir os dois atributos, que marcam o inicio e o fim da fila. typedef struct { int v[MAX]; int inicio, fim; }Fila;
  • 110. TAD: Fila Codificando as operações: Fila* criaFila () { Fila* q = (Fila*) malloc (sizeof(Fila)); q->inicio = 0; q->fim = 0; return q; }
  • 111. Antes de codificar vou pensar um pouco. Eu sei que quando eu enfileiro estarei incrementando o fim e quando eu desenfileiro eu incremento o inicio. Mas vou simular antes de codificar.
  • 112. Considerando uma fila de no máximo 3 elementos: 2 1 fim 0 q Inicio Fila *q = criaFila (); enfileira (q, 10); enfileira (q, 20); enfileira (q, 30); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); enfileira (q, 50); enfileira (q, 60); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q));
  • 113. Considerando uma fila de no máximo 3 elementos: 2 fim 1 0 10 q Inicio Fila *q = criaFila (); enfileira (q, 10); enfileira (q, 20); enfileira (q, 30); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); enfileira (q, 50); enfileira (q, 60); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q));
  • 114. Considerando uma fila de no máximo 3 elementos: fim 2 1 20 0 10 q Inicio Fila *q = criaFila (); enfileira (q, 10); enfileira (q, 20); enfileira (q, 30); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); enfileira (q, 50); enfileira (q, 60); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q));
  • 115. Considerando uma fila de no máximo 3 elementos: fim 2 30 1 20 0 10 q Inicio Fila *q = criaFila (); enfileira (q, 10); enfileira (q, 20); enfileira (q, 30); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); enfileira (q, 50); enfileira (q, 60); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q));
  • 116. Considerando uma fila de no máximo 3 elementos: fim 2 30 1 20 Inicio 0 q 10 Fila *q = criaFila (); enfileira (q, 10); enfileira (q, 20); enfileira (q, 30); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); enfileira (q, 50); enfileira (q, 60); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q));
  • 117. Considerando uma fila de no máximo 3 elementos: fim 2 30 Inicio 1 0 q 10 20 Fila *q = criaFila (); enfileira (q, 10); enfileira (q, 20); enfileira (q, 30); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); enfileira (q, 50); enfileira (q, 60); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q));
  • 118. Considerando uma fila de no máximo 3 elementos: fim 2 30 Inicio 1 0 q 10 20 Fila *q = criaFila (); enfileira (q, 10); enfileira (q, 20); enfileira (q, 30); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); enfileira (q, 50); enfileira (q, 60); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q));
  • 119. Considerando uma fila de no máximo 3 elementos: fim 2 30 Inicio 1 0 q Erro: Mesmo tendo áreas vagas, eu nao posso mais adicionar elemento. Fila *q = criaFila (); enfileira (q, 10); enfileira (q, 20); enfileira (q, 30); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); enfileira (q, 50); enfileira (q, 60); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q));
  • 120. TAD: Fila Solução, vetor circular: Depois do último elemento, temos o primeiro e antes do primeiro temos o último. Fonte:http://www2.dc.ufscar.br/~bsi/materiais/ed/u5.html
  • 121. Agora vou simular novamente, mas considerando meu vetor circular.
  • 122. Considerando uma fila de no máximo 3 elementos: 2 1 fim 0 q Inicio Fila *q = criaFila (); enfileira (q, 10); enfileira (q, 20); enfileira (q, 30); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); enfileira (q, 50); enfileira (q, 60); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q));
  • 123. Considerando uma fila de no máximo 3 elementos: 2 fim 1 0 10 q Inicio Fila *q = criaFila (); enfileira (q, 10); enfileira (q, 20); enfileira (q, 30); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); enfileira (q, 50); enfileira (q, 60); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q));
  • 124. Considerando uma fila de no máximo 3 elementos: fim 2 1 20 0 10 q Inicio Fila *q = criaFila (); enfileira (q, 10); enfileira (q, 20); enfileira (q, 30); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); enfileira (q, 50); enfileira (q, 60); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q));
  • 125. Considerando uma fila de no máximo 3 elementos: 2 30 1 20 0 10 q Inicio fim Fila *q = criaFila (); enfileira (q, 10); enfileira (q, 20); enfileira (q, 30); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); enfileira (q, 50); enfileira (q, 60); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q));
  • 126. Considerando uma fila de no máximo 3 elementos: 2 30 1 20 Inicio 0 q 10 fim Fila *q = criaFila (); enfileira (q, 10); enfileira (q, 20); enfileira (q, 30); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); enfileira (q, 50); enfileira (q, 60); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q));
  • 127. Considerando uma fila de no máximo 3 elementos: 2 30 Inicio 1 0 q 10 20 fim Fila *q = criaFila (); enfileira (q, 10); enfileira (q, 20); enfileira (q, 30); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); enfileira (q, 50); enfileira (q, 60); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q));
  • 128. Considerando uma fila de no máximo 3 elementos: 2 30 Inicio 1 0 50 q 10 20 fim Fila *q = criaFila (); enfileira (q, 10); enfileira (q, 20); enfileira (q, 30); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); enfileira (q, 50); enfileira (q, 60); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q));
  • 129. Considerando uma fila de no máximo 3 elementos: 2 30 1 60 0 50 q 10 20 Inicio fim Fila *q = criaFila (); enfileira (q, 10); enfileira (q, 20); enfileira (q, 30); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); enfileira (q, 50); enfileira (q, 60); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q));
  • 130. Considerando uma fila de no máximo 3 elementos: 2 1 60 0 50 q 10 20 30 fim Inicio Fila *q = criaFila (); enfileira (q, 10); enfileira (q, 20); enfileira (q, 30); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); enfileira (q, 50); enfileira (q, 60); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q));
  • 131. Considerando uma fila de no máximo 3 elementos: 2 1 60 0 q 10 20 30 50 fim Inicio Fila *q = criaFila (); enfileira (q, 10); enfileira (q, 20); enfileira (q, 30); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); enfileira (q, 50); enfileira (q, 60); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q));
  • 132. Considerando uma fila de no máximo 3 elementos: 2 Inicio fim 1 0 q 10 20 30 50 60 Fila *q = criaFila (); enfileira (q, 10); enfileira (q, 20); enfileira (q, 30); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); enfileira (q, 50); enfileira (q, 60); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q));
  • 133. Codificando as operações: void enfileira (Fila* q, int x) { q->v[q->fim++] = x; if (q->fim == MAX) q->fim = 0; }
  • 134. TAD: Fila Codificando as operações: void enfileira (Fila* q, int x) { q->v[q->fim++] = x; if (q->fim == MAX) q->fim = 0; } Adicionamos ao fim da fila e incrementamos a variável fim.
  • 135. TAD: Fila Codificando as operações: void enfileira (Fila* q, int x) { q->v[q->fim++] = x; if (q->fim == MAX) q->fim = 0; } Aqui simula o vetor circular. Se chega a MAX, então fim passa ser 0.
  • 136. TAD: Fila Codificando as operações: int desenfileira(Fila* q) { int x = q->v[q->inicio++]; if (q->inicio == MAX) q->inicio = 0; return x; } Similar ao enfileira, com a diferença que irei remover o elemento do inicio da fila.
  • 137. TAD: Fila Testando nossa codificação: int main () { Fila *q = criaFila (); enfileira (q, 10); enfileira (q, 20); enfileira (q, 30); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); enfileira (q, 40); printf ("%dn", desenfileira(q)); printf ("%dn", desenfileira(q)); return 0; } O que será impresso ?
  • 139. Fila: Aplicações •Em controle de processos operacional, fila de processos. no sistema •Em algoritmo de busca em grafo (busca em largura). •Algoritmo de caminho mínimo (Dijkstra). •Algoritmo de ordenação.
  • 140. Referências Bibliográficas •AARON, Tanenbaun. Estruturas de Dados usando C. São Paulo: Makron Books, 1995. •PEREIRA, Silvio. Estruturas de Dados Fundamentais. São Paulo: Editora Erica, 1996. •VELOSO, Paulo et al. Estruturas de Dados. Rio de Janeiro: Editora Campus, 1983.