Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas...

81
Pilhas e Filas Algoritmos e Estruturas de Dados 2 2017-1 Flavio Figueiredo (http://flaviovdf.github.io ) 1

Transcript of Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas...

Page 1: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

Pilhas e Filas

Algoritmos e Estruturas de Dados 22017-1Flavio Figueiredo (http://flaviovdf.github.io)

1

Page 2: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

Pilhas

2

Page 3: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

Pilhas (Stack)

● Estrutura similar às listas lineares que vimos na última aula

● [Mais Simples] Três operações principais○ stackPush

■ Insere um elemento no topo da pilha○ stackPop

■ Remove o elemento do topo da pilha○ stackIsEmpty

■ Indica se existe algum elemento na pilha

3

Page 4: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

Pilhas (Stack)

● Estrutura similar às listas lineares que vimos na última aula

● [Mais Simples] Três operações principais○ stackPush

■ Insere um elemento no topo da pilha○ stackPop

■ Remove o elemento do topo da pilha○ stackIsEmpty

■ Indica se existe algum elemento na pilha

● Uma pilha de pratos para limpar● Uma pilha de provas para corrigir

4

Page 5: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

[Calma] Eu já aprendi a lista linear, a mesma consegue remove e inserir do início.Preciso saber sobre pilhas?

5

Page 6: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

TADs São Contratos

● Se você precisa de uma pilha, melhor assinar o contrato da mesma

● Podemos implementar tudo sem tads, com vetores etc

● Boas práticas de programação usam os TADs certos nos momentos certos

6

Page 7: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

Contrato da Pilha

● As funções que precisamos sãoestas

● Mais de uma forma de implementar

● Usar Vetores por baixo○ Similar ao que vimos na aula passada

● Usar a Lista Encadeada por baixo

● Vamos fazer com ponteiros!

7

#ifndef STACK_H

#define STACK_H

stack_t *stackCreate();

void stackPush(stack_t *stack, int value);

int stackPop(stack_t *stack);

int stackIsEmpty(stack_t *stack);

void stackFree(stack_t *stack);

#endif

Page 8: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

Métodos

● stackCreate○ Cria a Pilha, aloca memória

● stackPush○ Insere um elemento no topo da Pilha

● stackPop○ Remove um elemento do topo da pilha

● stackIsEmpty○ Indica se a pilha está vazia

● stackFree○ Libera a memória 8

Page 9: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

Structs + Apontadores

● Adicionando os structs

● stack_node_t○ Similar a lista encadeada

○ Apontamos apenas para opróximo elemento

● stack_t ○ Um apontador para o topo da

pilha

● Lembre-se○ Value em int por simplicidade na aula 9

#ifndef STACK_H

#define STACK_H

typedef struct stack_node {

int value;

struct stack_node *next;

} stack_node_t;

typedef struct {

stack_node_t *head;

} stack_t;

stack_t *stackCreate();

void stackPush(stack_t *stack, int value);

int stackPop(stack_t *stack);

int stackIsEmpty(stack_t *stack);

void stackFree(stack_t *stack);

#endif

Page 10: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

Abstraindo

10

head

value

NULL

value

next

value

next

value

next

typedef struct {

stack_node_t *head;

} stack_t;

typedef struct stack_node {

int value;

struct stack_node *next;

} stack_node_t;

Page 11: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

Implementando:stackCreate

11

Page 12: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

stackCreate

12

head

NULL

Page 13: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

stackCreate

13

head

NULL

stack_t *stackCreate() {

stack_t *stack = (stack_t *) malloc(sizeof(stack_t));

if (stack == NULL) {

printf("Memory error");

exit(1);

}

stack->head = NULL;

return stack;

}

Page 14: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

stackPush

14

head

value

NULL

Page 15: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

stackPush

15

head

value

NULL

value

next

Page 16: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

stackPush

16

head

value

NULL

value

next

Page 17: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

stackPush

17

head

value

NULL

value

next

Page 18: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

stackPush

18

head

value

NULL

value

next

value

next

Page 19: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

stackPush (algumas chamadas depois)

19

head

value

NULL

value

next

value

next

value

next

Page 20: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

stackPush

20

● Observe como head sempre aponta para o última elemento

● O primeiro sempre tem NULL como next

● O efeito é como a pilha ao lado○ Apenas vita na horizontal

● Sempre lidamos com o topo da pilha○ Head

head

value

NULL

value

next

value

next

Page 21: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

stackPush

21

head

value

NULL

void stackPush(stack_t *stack, int value) {

stack_node_t *node = (stack_node_t *) malloc(sizeof(stack_node_t));

if (node == NULL) {

printf("Memory error");

exit(1);

}

node->value = value;

node->next = stack->head;

stack->head = node;

}

Page 22: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

stackPush

22

head

value

NULL

value

next

void stackPush(stack_t *stack, int value) {

stack_node_t *node = (stack_node_t *) malloc(sizeof(stack_node_t));

if (node == NULL) {

printf("Memory error");

exit(1);

}

node->value = value;

node->next = stack->head;

stack->head = node;

}

Page 23: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

stackPush

23

head

value

NULL

value

next

value

next

void stackPush(stack_t *stack, int value) {

stack_node_t *node = (stack_node_t *) malloc(sizeof(stack_node_t));

if (node == NULL) {

printf("Memory error");

exit(1);

}

node->value = value;

node->next = stack->head;

stack->head = node;

}

Page 24: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

stackPop

24

head

value

NULL

value

next

value

next

Page 25: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

stackPop

25

head

value

NULL

value

next

● Reduzimos o tamanho da Pilha

● Tiramos um "prato" do topo○ 1 prova○ 1 artigo para ler

● Isto tem alguma relação com chamada de funções?

Page 26: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

stackPop

26

head

value

NULL

● Reduzimos o tamanho da Pilha

● Tiramos um "prato" do topo○ 1 prova○ 1 artigo para ler

● Isto tem alguma relação com chamada de funções?○ Quando chamamos uma função empilhamos a mesma○ Fica no topo, quem executa agora○ Ao remover, voltamos para a anterior○ Por isso dizemos que a chamada de funções é uma Pilha

Page 27: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

stackPop

27

head

value

NULL

value

next

value=3

next

int stackPop(stack_t *stack) {

stack_node_t *toFree;

int toReturn;

if (stack->head != NULL) {

toFree = stack->head;

toReturn = toFree->value;

stack->head = stack->head->next;

free(toFree);

} else {

printf("Stack is empty!!!");

exit(1);

}

return toReturn;

}

Page 28: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

stackPop

28

head

value

NULL

value

next

value=3

next

int stackPop(stack_t *stack) {

stack_node_t *toFree;

int toReturn;

if (stack->head != NULL) {

toFree = stack->head;

toReturn = toFree->value;

stack->head = stack->head->next;

free(toFree);

} else {

printf("Stack is empty!!!");

exit(1);

}

return toReturn;

}

toFree

Page 29: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

stackPop

29

head

value

NULL

value

next

value=3

next

int stackPop(stack_t *stack) {

stack_node_t *toFree;

int toReturn;

if (stack->head != NULL) {

toFree = stack->head;

toReturn = toFree->value;

stack->head = stack->head->next;

free(toFree);

} else {

printf("Stack is empty!!!");

exit(1);

}

return toReturn;

}

toFree

toReturn = 3;

Page 30: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

stackPop

30

head

value

NULL

value

next

value

next

int stackPop(stack_t *stack) {

stack_node_t *toFree;

int toReturn;

if (stack->head != NULL) {

toFree = stack->head;

toReturn = toFree->value;

stack->head = stack->head->next;

free(toFree);

} else {

printf("Stack is empty!!!");

exit(1);

}

return toReturn;

}

Atualiza o head

toFree

toReturn = 3;

Page 31: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

stackPop

31

head

value

NULL

value

next

int stackPop(stack_t *stack) {

stack_node_t *toFree;

int toReturn;

if (stack->head != NULL) {

toFree = stack->head;

toReturn = toFree->value;

stack->head = stack->head->next;

free(toFree);

} else {

printf("Stack is empty!!!");

exit(1);

}

return toReturn;

}

toReturn = 3;

Page 32: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

stackFree

32

void stackFree(stack_t *stack) {

stack_node_t *next = stack->head;

stack_node_t *toFree = NULL;

while (next != NULL) {

toFree = next;

next = next->next;

free(toFree);

}

free(stack);

}

head

value

NULL

value

next

value

next

Page 33: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

stackIsEmpty

33

int stackIsEmpty(stack_t *stack) {

if (stack->head == NULL) {

return 1;

} else {

return 0;

}

}

Serve para que os usuários do TADsaibam que uma pilha não tem nada!

Page 34: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

Um main.c usandoo STACK_H

34

#include <stdio.h>

#include "stack.h"

int main() {

stack_t *stack = stackCreate();

int i;

for (i = 0; i < 10; i++) {

printf("Push %d\n", i);

stackPush(stack, i);

}

printf("\n");

while (stackIsEmpty(stack) != 1) {

printf("Pop %d\n", stackPop(stack));

}

for (i = 0; i < 10; i++) {

stackPush(stack, i * 200);

}

stackDestroy(stack);

return 0;

}

Page 35: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

35

#include <stdio.h>

#include "stack.h"

int main() {

stack_t *stack = stackCreate();

int i;

for (i = 0; i < 10; i++) {

printf("Push %d\n", i);

stackPush(stack, i);

}

printf("\n");

while (stackIsEmpty(stack) != 1) {

printf("Pop %d\n", stackPop(stack));

}

for (i = 0; i < 10; i++) {

stackPush(stack, i * 200);

}

stackDestroy(stack);

return 0;

}

Push 0Push 1Push 2Push 3Push 4Push 5Push 6Push 7Push 8Push 9

Pop 9Pop 8Pop 7Pop 6Pop 5Pop 4Pop 3Pop 2Pop 1Pop 0

Page 36: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

Pilhas

● Último a entrar é o primeiro a sair

● LIFO○ Last-in-first-out

36

Page 37: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

Notação Polonesa Reversa

37

3 4 +7

5 1 2 + 4 × + 3 −??

https://en.wikipedia.org/wiki/Reverse_Polish_notation

Page 38: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

5 1 2 + 4 × + 3 −

38

Page 39: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

1 2 + 4 × + 3 −

39

5

Lê 5stackPush(stack, 5);

Page 40: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

2 + 4 × + 3 −

40

1

5

Lê 1stackPush(stack, 1);

Page 41: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

+ 4 × + 3 −

41

2

1

5

Lê 2stackPush(stack, 2);

Page 42: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

4 × + 3 −

42

2

1

5

Lê +E agora?

Page 43: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

4 × + 3 −

43

2

1

5

Lê +result = stackPop(stack) + stackPop(stack);result = 1 + 2 = 3; //Note que o segundo elemento vem antes

Page 44: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

4 × + 3 −

44

1

5

Lê +result = stackPop(stack) + stackPop(stack);result = 1 + 2 = 3;

Page 45: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

4 × + 3 −

45

5

Lê +result = stackPop(stack) + stackPop(stack);result = 1 + 2 = 3 ;

Page 46: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

4 × + 3 −

46

3

5

Coloca result na pilha

Page 47: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

× + 3 −

47

4

3

5

Lê 4stackPush(stack, 4);

Page 48: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

+ 3 −

48

Lê xresult += stackPop(stack) * stackPop(stack);result = 3 * 4 = 12;

4

3

5

Page 49: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

+ 3 −

49

Lê xresult += stackPop(stack) * stackPop(stack);result = 3 * 4 = 12;

5

Page 50: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

+ 3 −

50

Empilha result

12

5

Page 51: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

3 −

51

12 + 5 agora

12

5

Page 52: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

3 −

52

12 + 5 agora

Page 53: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

3 −

53

12 + 5 agora

17

Page 54: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

54

Lê 3

3

17

Page 55: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

55

Resultado final é?

3

17

Page 56: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

56

Resultado final é?17 - 3 = 14;

3

17

Page 57: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

57

14

5 1 2 + 4 × + 3 −

Page 58: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

Exercício

● Escreva um programa que lê da entrada uma expressão feita na notação polonesa reversa

● Resolva a expressão

● Use uma pilha○ Tente implementar do 0 para aprender

58

Page 59: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

Custos

● stackCreate○ O(1)

● stackPush○ O(1)

● stackPop○ O(1)

● stackFree○ O(n)

● stackIsEmpty○ O(1) 59

Page 60: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

Exercício

● No TP1

● Como usar uma pilha para imprimir as transações ordenadas por data?○ Iniciando da mais recente no topo

60

Page 61: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

Filas

61

Page 62: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

Filas (FIFO)

● O “oposto” de uma Pilha

● Primeiro valor a ser inserido é o primeiro a ser removido

● Fila do Banco● Fila da Impressora● Fila do Cinema

62

Page 63: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

TAD

● Bastante similar a ideia de listas da aula passada

● Não vamos nos preocuparcom inserir e remover do meio

● Novamente, pode ser implementado com vetores

● Vamos fazer com apontadores!

63

#ifndef FIFO_H

#define FIFO_H

typedef struct fifo_node {

int value;

struct fifo_node *next;

} fifo_node_t;

typedef struct {

fifo_node_t *head;

fifo_node_t *tail;

} fifo_t;

fifo_t *fifoCreate();

void fifoInsert(fifo_t *fifo, int value);

int fifoRemove(fifo_t *fifo);

int fifoIsEmpty(fifo_t *fifo);

void fifoFree(fifo_t *fifo);

#endif

Page 64: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

Representando a FIFO

64

head tail

value

next

value

next

value

next

value

NULL

Page 65: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

Representando a FIFO

65

head tail

Page 66: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

Representando a FIFO

66

head tail

value

NULL

Page 67: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

Representando a FIFO

67

head tail

value

next

value

NULL

Page 68: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

Representando a FIFO

68

head tail

value

next

value

next

value

next

value

NULL

Page 69: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

fifoCreate

69

fifo_t *fifoCreate() {

fifo_t *fifo = (fifo_t *) malloc(sizeof(fifo_t));

if (fifo == NULL) {

printf("Memory error");

exit(1);

}

fifo->head = NULL;

fifo->tail = NULL;

return fifo;

}

Page 70: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

fifoInsert

70

● Alocamos o novo nó

● Atualizamos o fim da fila

● Tratamento para a fila vazia

● O head fica constante utilizamos para remover

Page 71: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

fifoInsert

71

void fifoInsert(fifo_t *fifo, int value) {

fifo_node_t *node = (fifo_node_t *) malloc(sizeof(fifo_node_t));

if (node == NULL) {

printf("Memory error");

exit(1);

}

node->value = value;

node->next = NULL;

if (fifo->head == NULL) {

fifo->head = node;

fifo->tail = node;

} else {

fifo->tail->next = node;

fifo->tail = node;

}

}

Page 72: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

fifoInsert

72

void fifoInsert(fifo_t *fifo, int value) {

fifo_node_t *node = (fifo_node_t *) malloc(sizeof(fifo_node_t));

if (node == NULL) {

printf("Memory error");

exit(1);

}

node->value = value;

node->next = NULL;

if (fifo->head == NULL) {

fifo->head = node;

fifo->tail = node;

} else {

fifo->tail->next = node;

fifo->tail = node;

}

}

head tail

value

next

value

next

value

NULL

Page 73: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

fifoInsert

73

void fifoInsert(fifo_t *fifo, int value) {

fifo_node_t *node = (fifo_node_t *) malloc(sizeof(fifo_node_t));

if (node == NULL) {

printf("Memory error");

exit(1);

}

node->value = value;

node->next = NULL;

if (fifo->head == NULL) {

fifo->head = node;

fifo->tail = node;

} else {

fifo->tail->next = node;

fifo->tail = node;

}

}

head tail

value

next

value

next

value

next

value

NULL

Page 74: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

fifoInsert

74

void fifoInsert(fifo_t *fifo, int value) {

fifo_node_t *node = (fifo_node_t *) malloc(sizeof(fifo_node_t));

if (node == NULL) {

printf("Memory error");

exit(1);

}

node->value = value;

node->next = NULL;

if (fifo->head == NULL) {

fifo->head = node;

fifo->tail = node;

} else {

fifo->tail->next = node;

fifo->tail = node;

}

}

head tail

value

next

value

next

value

next

value

NULL

Page 75: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

fifoInsert

75

void fifoInsert(fifo_t *fifo, int value) {

fifo_node_t *node = (fifo_node_t *) malloc(sizeof(fifo_node_t));

if (node == NULL) {

printf("Memory error");

exit(1);

}

node->value = value;

node->next = NULL;

if (fifo->head == NULL) {

fifo->head = node;

fifo->tail = node;

} else {

fifo->tail->next = node;

fifo->tail = node;

}

}

head tail

value

next

value

next

value

next

value

NULL

Page 76: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

fifoRemove

● Removemos o primeiro nó

● Atualizamos o head

● Tratamento para a fila vazia

● free

● Retornamos o valor

76

int fifoRemove(fifo_t *fifo) {

fifo_node_t *toFree;

int toReturn;

if (fifo->head != NULL) {

toReturn = fifo->head->value;

toFree = fifo->head;

fifo->head = fifo->head->next;

free(toFree);

} else {

printf("FIFO is empty");

exit(1);

}

return toReturn;

}

Page 77: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

fifoRemove

77

int fifoRemove(fifo_t *fifo) {

fifo_node_t *toFree;

int toReturn;

if (fifo->head != NULL) {

toReturn = fifo->head->value;

toFree = fifo->head;

fifo->head = fifo->head->next;

free(toFree);

} else {

printf("FIFO is empty");

exit(1);

}

return toReturn;

}

head tail

value

next

value

next

value

NULL

toFree

Page 78: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

fifoRemove

78

int fifoRemove(fifo_t *fifo) {

fifo_node_t *toFree;

int toReturn;

if (fifo->head != NULL) {

toReturn = fifo->head->value;

toFree = fifo->head;

fifo->head = fifo->head->next;

free(toFree);

} else {

printf("FIFO is empty");

exit(1);

}

return toReturn;

}

head tail

value

next

value

next

value

NULL

toFree

Page 79: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

fifoRemove

79

int fifoRemove(fifo_t *fifo) {

fifo_node_t *toFree;

int toReturn;

if (fifo->head != NULL) {

toReturn = fifo->head->value;

toFree = fifo->head;

fifo->head = fifo->head->next;

free(toFree);

} else {

printf("FIFO is empty");

exit(1);

}

return toReturn;

}

head tail

value

next

value

NULL

Page 80: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

Funções Restantes

● fifoIsEmpty○ Similar ao da pilha

● fifoFree○ Similar ao da pilha

● Ver código em:https://github.com/flaviovdf/AEDS2-2017-1/tree/master/exemplos/filaspilhas

80

Page 81: Pilhas e Filas - Flavio Figueiredo · Pilhas 2. Pilhas (Stack) Estrutura similar às listas lineares que vimos na última aula [Mais Simples] Três operações principais stackPush

Custos

● fifoCreate○ O(1)

● fifoInsert○ O(1)

● fifoRemove○ O(1)

● fifoFree○ O(n)

● fifoIsEmpty○ O(1) 81