logo - universidade federal de itajubárcosta62br.unifei.edu.br/escola/eip_07.pdf · estrutura de...

90
Logo

Upload: others

Post on 09-Jul-2020

3 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

Logo

Page 2: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

2

Aula 07Aula 07

● Estruturas de dados

– Lista, Pilha, Fila– Pair, Map, Set e Bitset

Page 3: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

3

Estrutura de DadosEstrutura de Dados

• Estrutura de dados já foi vista em vetores, que foi uma maneira de manipular várias informações (variáveis ou estruturas) de uma vez só, pois poderíamos declarar vários desses elementos.

• Quando isso era feito, esses dados estavam em uma sequência rigidamente definida na memória, bem como o número de elementos eram constantes. Esses dois detalhes, na verdade, possuem algumas limitações.

Page 4: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

4

Estrutura de DadosEstrutura de Dados

• Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de estar presos ao conceito de "número de elementos fixos", pois lá alocávamos e realocávamos o tanto de espaços de memória.

• Aplica-se os conceitos anterior nos tipos de estrutura de dados: Listas, Filas, Pilhas, Árvores e Grafo.

Page 5: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

5

Estrutura de DadosEstrutura de Dados

• Listas, filas e pilhas são estrutura de dados lineares.

• Árvores e Grafo são estrutura de dados não lineares.

Page 6: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

6

Listas EncadeadasListas Encadeadas

• Esqueça a programação. Use seu bom senso e responda:

o que é uma lista?o que é uma lista?

• Vamos supor que você fez uma lista de compras. Ou seja, tem um pedaço de papel com diversos elementos, em uma dada ordem. Provavelmente essa ordem é a que você vai comprar, do primeiro para o último. Geralmente elas tem uma sequência lógica, como elementos do mesmo setores estarem adjacentes.

Page 7: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

7

Listas EncadeadasListas Encadeadas

• A analogia é parecida para uma lista em C/C++.

• Em programação, lista é uma série de elementos ligados. O primeiro é ligado no segundo, que é ligado no terceiro etc.

• Iremos aprender como colocar elementos, tirar, mudar de posição. Como elas estão ligadas, basta que tenhamos o endereço (ponteiro) para o primeiro elemento da lista.

• Ou seja, iremos estudar as chamadas listas encadeadas, que são itens 'alinhados' numa fila.

Page 8: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

8

Listas EncadeadasListas Encadeadas

• A lista encadeada terá a seguinte estrutura:

struct REGISTRO {struct REGISTRO {

int data; int data;

struct REGISTRO *next;struct REGISTRO *next;

};};

Page 9: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

9

Listas EncadeadasListas Encadeadas

• É conveniente tratar as células como um novo tipo-de-dados e atribuir um nome a esse novo tipo:

typedef struct REGISTRO celula;typedef struct REGISTRO celula;

• Uma célula c e um ponteiro p para uma célula podem ser declarados assim:

celula c, *p;celula c, *p;

• Se c é uma célula então c.data é o conteúdo da célula e c.next é o endereço da próxima célula. Se p é o endereço de uma célula, então p->data é o conteúdo da célula e p->next é o endereço da próxima célula. Se p é o endereço da última célula da lista então p->next vale NULL .

Page 10: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

10

Listas EncadeadasListas Encadeadas

• A lista encadeadas precisam das funções:– Inicia

– Insere

– Remove

– Imprimi

– Libera

Page 11: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

11

IniciaInicia

• A lista encadeada tem que ser inicializada sempre que for começar.

celula* inicia (void)celula* inicia (void){{

return NULL;return NULL;

}}

Page 12: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

12

InsereInsere

• Considere o problema de inserir uma nova célula em uma lista encadeada. Suponha que quero inserir a nova célula entre a posição apontada por p e a posição seguinte. (É claro que isso só faz sentido se p é diferente de NULL).

celula* insere (int x, celula *p)celula* insere (int x, celula *p){{

celula *nova;celula *nova; nova = (celula *) malloc(sizeof(celula));nova = (celula *) malloc(sizeof(celula)); nova->data = x;nova->data = x; nova->next = p;nova->next = p; return nova;return nova;}}

Page 13: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

13

RemoveRemove

• Considere o problema de remover uma certa célula de uma lista encadeada. Como especificar a célula em questão? A ideia mais óbvia é apontar para a célula que quer remover.

Page 14: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

14

RemoveRemovecelula* remove (int y, celula *p)celula* remove (int y, celula *p){{

celula *a, *b;celula *a, *b;a = NULL;a = NULL;b = p;b = p;while (b != NULL && b->data != y) {while (b != NULL && b->data != y) {

a = b;a = b;b = b->next;b = b->next;

}}if (b == NULL) {if (b == NULL) {

return p;return p;}}if (a == NULL){if (a == NULL){

p = b->next;p = b->next;} else {} else {

a->next = b->next;a->next = b->next;}}free (b);free (b);return p;return p;

}}

Page 15: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

15

ImprimiImprimi

• Para imprimir o conteúdo de uma lista encadeada, faça:

void imprima (celula *p)void imprima (celula *p){{

celula *I;celula *I;for (I = p; I != NULL; I = I->next)for (I = p; I != NULL; I = I->next){{

printf ("%d ", I->data);printf ("%d ", I->data);}}printf("\n");printf("\n");

}}

Page 16: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

16

LiberaLibera

• Libera os valores da lista encadeadas.

void libera(celula *p) void libera(celula *p) {{

celula *lixo, *aux;celula *lixo, *aux;lixo = p;lixo = p;while(lixo != NULL)while(lixo != NULL){{

aux = lixo->next;aux = lixo->next;free(lixo);free(lixo);lixo = aux;lixo = aux;

}}}}

Page 17: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

17

ExemploExemplo

• O professor tem uma lista de itens a colocar e retirar de uma lista, para isso ele vai colocar I e um número inteiro e colocar R e um número a ser retirado. E para mostrar os valores que tem na lista ele vai colocar M.

• Você tem como fazer um programa que resolva esse problema do professor.

Page 18: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

18

ProgramaPrograma

#include <bits/stdc++.h>using namespace std;struct REGISTRO { int data; struct REGISTRO *next;};typedef struct REGISTRO celula;celula* inicia (void);celula* insere (int x, celula *p);void imprima (celula *p);celula* remove (int y, celula *p);void libera(celula *p);

Page 19: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

19

ProgramaPrograma

celula* inicia (void){

return NULL;}celula* insere (int x, celula *p){

celula *nova; nova = (celula *) malloc(sizeof(celula)); nova->data = x; nova->next = p; return nova;}

Page 20: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

20

ProgramaPrograma

void imprima (celula *p){

celula *I;for (I = p; I != NULL; I = I->next){

printf ("%d ", I->data);}printf("\n");

}celula* remove (int y, celula *p){

celula *a, *b;a = NULL;b = p;

Page 21: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

21

ProgramaPrograma

while (b != NULL && b->data != y) {

a = b;b = b->next;

}if (b == NULL){

return p;}if (a == NULL){

p = b->next;} else {

a->next = b->next;}

Page 22: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

22

ProgramaPrograma

free (b);return p;

}void libera(celula *p){

celula *lixo, *aux;lixo = p;while(lixo != NULL){

aux = lixo->next;free(lixo);lixo = aux;

}}

Page 23: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

23

ProgramaPrograma

int main(){

int n;char op;celula *p;freopen("entrada.txt", "r", stdin);p = inicia();

Page 24: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

24

ProgramaPrograma

while (scanf(" %c", &op) != EOF){

switch (op){

case 'I':scanf("%d", &n);p = insere(n, p);break;case 'R':scanf("%d", &n);p = remove(n, p);break;case 'M':imprima(p);

}}

Page 25: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

25

ProgramaPrograma

libera(p);return 0;

}

Page 26: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

26

Entrada do programaEntrada do programa

Entrada:I 10I 20I 30MR 20MI 40I 50R 10R 30M

Page 27: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

27

Saída do programaSaída do programa

Saída:30 20 10 30 10 50 40

Page 28: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

28

ListasListas

• Uma vez entendidas as listas encadeadas básicas, você pode inventar muitos outros tipos de listas encadeadas.

• Por exemplo, você pode construir uma lista encadeada circular, em que a última célula aponta para a primeira. O endereço de uma tal lista é o endereço de uma de suas células (a última, por exemplo). Você pode também ter uma lista duplamente encadeada: cada célula contém o endereço da célula anterior e o endereço da célula seguinte.

• Mas pode-se usar o vetor estático ou a STL com a vector para produzir uma lista encadeada.

Page 29: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

29

FILAFILA

• Uma fila é uma estrutura de dados dinâmica que admite remoção de elementos e inserção de novos objetos. Mais especificamente, uma fila (= queue) é uma estrutura sujeita à seguinte regra de operação: sempre que houver uma remoção, o elemento removido é o que está na estrutura há mais tempo.

• Em outras palavras, o primeiro objeto inserido na fila é também o primeiro a ser removido. Essa política é conhecida pela sigla FIFO (= First-In-FIFO (= First-In-First-Out)First-Out).

https://www.geeksforgeeks.org/queue-data-structure/

Page 30: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

30

FILAFILA

• As funções suportadas pela fila da STL são:– empty ()empty () - Retorna se a fila está vazia;

– size ()size () - Retorna o tamanho da fila;

– front ()front () - Retorna uma referência ao primeiro elemento da fila;

– back ()back () - Retorna uma referência ao último elemento da fila;

– push (n)push (n) - Adiciona o elemento "n" no final da fila;

– pop ()pop () - Exclui o primeiro elemento da fila.

Page 31: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

31

ProgramaPrograma

#include <bits/stdc++.h>using namespace std;void imprima(queue <int> F);void imprima(queue <int> F){ queue <int> fila = F; while (!fila.empty()) { printf("%d ", fila.front()); fila.pop(); } printf("\n");}

Page 32: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

32

ProgramaPrograma

int main(){ queue <int> Fila; int n; char op; freopen("entrada.txt", "r", stdin);

Page 33: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

33

ProgramaPrograma

while (scanf(" %c", &op) != EOF) {switch (op) {

case 'I':scanf("%d", &n);Fila.push(n);break;case 'R':Fila.pop();break;case 'M':imprima(Fila);

}}

return 0;}

Page 34: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

34

Entrada do programaEntrada do programa

Entrada:I 10I 20I 30MRMI 40I 50RRM

Page 35: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

35

Saída do programaSaída do programa

Saída:10 20 30 20 30 40 50

Page 36: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

36

PilhaPilha

• Uma pilha é uma estrutura de dados que admite remoção de elementos e inserção de novos objetos. Mais especificamente, uma pilha (= stack) é uma estrutura sujeita à seguinte regra de operação: sempre que houver uma remoção, o elemento removido é o que está na estrutura há menos tempo.

• Em outras palavras, o primeiro objeto a ser inserido na pilha é o último a ser removido. Essa política é conhecida pela sigla LIFO (= Last-In-First-Out).

https://www.geeksforgeeks.org/stack-data-structure/

Page 37: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

37

PILHAPILHA

• As funções associadas à pilha são:– empty ()empty () - Retorna se a pilha está vazia;

– size ()size () - Retorna o tamanho da pilha;

– top ()top () - Retorna uma referência ao elemento mais alto da pilha;

– push (n)push (n) - Adiciona o elemento "n" no topo da pilha;

– pop ()pop () - Apaga o elemento mais alto da pilha.

Page 38: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

38

ProgramaPrograma

#include <bits/stdc++.h>using namespace std;void imprima(stack <int> P);void imprima(stack <int> P){ stack <int> pilha = P; while (!pilha.empty()) { printf("%d ", pilha.top()); pilha.pop(); } printf("\n");}

Page 39: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

39

ProgramaPrograma

int main(){ stack <int> P; int n; char op; freopen("entrada.txt", "r", stdin);

Page 40: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

40

ProgramaPrograma

while (scanf(" %c", &op) != EOF) {switch (op) {

case 'I':scanf("%d", &n);P.push(n);break;case 'R':P.pop();break;case 'M':imprima(P);

}}

return 0;}

Page 41: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

41

Entrada do programaEntrada do programa

Entrada:I 10I 20I 30MRMI 40I 50RRM

Page 42: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

42

Saída do programaSaída do programa

Saída:30 20 10 20 10 20 10

Page 43: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

43

ListList

• Listas são contêineres de sequência que permitem a alocação de memória não contígua. Em comparação com o vetor, a lista tem um percurso lento, mas assim que uma posição é encontrada, a inserção e a exclusão são rápidas. Normalmente, quando dizemos uma lista, falamos sobre a lista duplamente vinculada. Para implementar uma lista ligada, usamos a lista de encaminhamento.

https://www.geeksforgeeks.org/list-cpp-stl/

Page 44: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

44

LISTLIST

• Funções usadas com a lista:– front () - front () - Retorna o valor do primeiro elemento

da lista;– back () - back () - Retorna o valor do último elemento

da lista;– push_front (n) - push_front (n) - Adiciona um novo elemento

"n" no início da lista;– push_back (n) - push_back (n) - Adiciona um novo elemento

"n" no final da lista;– pop_front () - pop_front () - Remove o primeiro elemento da

lista e reduz o tamanho da lista em 1;– pop_back () - pop_back () - Remove o último elemento da

lista e reduz o tamanho da lista em 1;

Page 45: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

45

LISTLIST

• Funções usadas com a lista:– begin () - begin () - Retorna um iterador apontando para

o primeiro elemento da lista;– end () - end () - Retorna um iterador apontando para o

último elemento teórico que segue o último elemento;

– empty () - empty () - Retorna se a lista está vazia (1) ou não (0);

– insert () - insert () - Insere novos elementos na lista antes do elemento em uma posição especificada;

– erase () - erase () - Remove um único elemento ou um intervalo de elementos da lista;

Page 46: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

46

LISTLIST

• Funções usadas com a lista:– assign () - assign () - Atribui novos elementos para lista,

substituindo os elementos atuais e redimensiona a lista;

– remove () - remove () - Remove todos os elementos da lista, que são iguais ao dado elemento;

– reverse () - reverse () - Inverte a lista;– size () - size () - Retorna o número de elementos na

lista;– sort () - sort () - Classifica a lista em ordem crescente.

Page 47: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

47

ProgramaPrograma

#include <bits/stdc++.h>using namespace std;void imprima(list <int> L);void imprima(list <int> L){ list <int> :: iterator it; for(it = L.begin(); it != L.end(); ++it) { printf("%d ", *it); } printf("\n");}

Page 48: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

48

ProgramaPrograma

int main(){ list <int> L; int n, m; char op, ch; freopen("entrada.txt", "r", stdin);

while (scanf(" %c", &op) != EOF){

switch (op){

case 'I':scanf("%d %d", &n, &m);L.push_front(n);L.push_back(m);break;

Page 49: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

49

ProgramaPrograma

case 'R':scanf(" %c", &ch);if (ch == 'F'){

L.pop_front();} else {

L.pop_back();}break;case 'M':imprima(L);

}}

return 0;}

Page 50: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

50

Entrada do programaEntrada do programa

Entrada:I 10 20I 20 30I 30 10MR FMI 40 50I 50 40R BR BM

Page 51: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

51

Saída do programaSaída do programa

Saída:30 20 10 20 30 10 20 10 20 30 10 50 40 20 10 20 30 10

Page 52: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

52

PairPair

• O contêiner de pair é um contêiner simples definido no cabeçalho <utility> que consiste em dois elementos ou objetos de dados.– O primeiro elemento é referenciado como

"first" e o segundo como "second" e o pedido é fixo (first, second).

– Pair é usado para combinar dois valores que podem ser diferentes no tipo. Par fornece uma maneira de armazenar dois objetos heterogêneos como uma única unidade.

Page 53: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

53

PairPair

– Pair pode ser atribuído, copiado e comparado. O vetor de objetos alocados em um map ou hash_map é do tipo "pair" por padrão, na qual todos os elementos "first" são chaves exclusivas associadas a seus objetos de valor "second".

– Para acessar os elementos, usamos o nome da variável seguido pelo operador de ponto seguido pela palavra-chave first ou second.

https://www.geeksforgeeks.org/sorting-vector-of-pairs-in-c-set-1-sort-by-first-and-second/

Page 54: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

54

ProgramaPrograma

#include <bits/stdc++.h>using namespace std; int main(){ vector <pair <int, char> > P; int n, i, x; char op; freopen("entrada.txt", "r", stdin);

while (scanf("%d %c", &x, &op) != EOF){

P.push_back(make_pair(x, op));}

Page 55: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

55

ProgramaPrograma

n = P.size();for (i = 0; i < n; i++){

cout << P[i].second << " ";cout << P[i].first << endl;

}

Page 56: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

56

ProgramaPrograma

sort(P.begin(), P.end());printf("Ordenado pelo primeiro:\n");for (i = 0; i < n; i++){

cout << P[i].second << " ";cout << P[i].first << endl;

}return 0;

}

Page 57: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

57

Entrada do programaEntrada do programa

Entrada:10 A40 B30 C70 D50 A20 B

Page 58: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

58

Saída do programaSaída do programa

Saída:A 10B 40C 30D 70A 50B 20Ordenado pelo primeiro:A 10B 20C 30B 40A 50D 70

Page 59: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

59

MapMap

• Maps são contêineres associativos que armazenam elementos de forma mapeada. Cada elemento possui um valor de chave e um valor mapeado. Nenhum valor mapeado pode ter os mesmos valores de chave.

• Funções associadas ao map:– begin ()begin () - Retorna um iterador para o primeiro

elemento no map;

– end ()end () - Retorna um iterador ao elemento teórico que segue o último elemento no map;

– size ()size () - Retorna o número de elementos no map;

https://www.geeksforgeeks.org/map-associative-containers-the-c-standard-template-library-stl/

Page 60: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

60

MapMap

• Funções associadas ao map:– max_size () - max_size () - Retorna o número máximo de

elementos que o map pode conter;

– empty () -empty () - Retorna se o map está vazio

– pair insert (keyvalue, mapvalue) - pair insert (keyvalue, mapvalue) - AdicioAdiciona um novo elemento ao map;

– erase (iterador position) - erase (iterador position) - Remove o elemento na posição apontada pelo iterador;

– erase (const n) - erase (const n) - Remove o valor da chave "n" do map;

– clear () - clear () - Remove todos os elementos do map;

Page 61: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

61

MapMap

• Funções associadas ao map:– key_comp () / value_comp () - key_comp () / value_comp () - Retorna o

objeto que determina como os elementos no map são ordenados ('<' por padrão)

– find (const n) - find (const n) - Retorna um iterador ao elemento com o valor da chave "n" no map, se encontrado, senão retorna o iterador ao final

– count (const n) - count (const n) - Retorna o número de correspondências para o elemento com o valor da chave "n" no map;

Page 62: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

62

MapMap

• Funções associadas ao map:– lower_bound (const n) - lower_bound (const n) - Retorna um iterador

ao primeiro elemento que é equivalente ao valor mapeado com o valor da chave "n" ou definitivamente não irá antes do elemento com o valor da chave "n" no map;

– upper_bound (const n) - upper_bound (const n) - Retorna um iterador ao primeiro elemento que é equivalente ao valor mapeado com o valor da chave "n" ou, definitivamente, irá após o elemento com o valor da chave "n" no map.

Page 63: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

63

ProgramaPrograma

#include <bits/stdc++.h>using namespace std;int main(){ freopen("entrada.txt", "r", stdin); map <int, int> mapa; int i, n, x, y; scanf("%d", &n); for (i = 0; i < n; i++) { scanf("%d %d", &x, &y); mapa.insert(pair <int, int> (x, y)); }

Page 64: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

64

ProgramaPrograma

map <int, int> :: iterator itr; cout << "\tO mapa eh:\n"; cout << "\tChave\tElemento\n"; for (itr = mapa.begin(); itr != mapa.end(); ++itr) { cout << '\t' << itr->first << '\t' << itr->second << '\n'; } return 0;}

Page 65: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

65

Entrada do programaEntrada do programa

Entrada:71 402 303 604 205 506 507 10

Page 66: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

66

Saída do programaSaída do programa

Saída:O mapa eh:Chave Elemento1 402 303 604 205 506 507 10

Page 67: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

67

URI 1281URI 1281

#include <bits/stdc++.h>using namespace std;int main() {

freopen("entrada.txt", "r", stdin);map <string, double> tab;double p, total;string prod;int c, n;scanf("%d", &c);

Agradecimento ao amigoEdgar Almeira

Page 68: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

68

URI 1281URI 1281

while(c--){total=0;scanf("%d", &n);while(n--){

cin >> prod;scanf("%lf", &p);tab[prod] = p;

}

Agradecimento ao amigoEdgar Almeira

Page 69: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

69

URI 1281URI 1281

scanf("%d", &n);while(n--){

cin >> prod;scanf("%lf", &p);total += (tab[prod] * p);

}printf("R$ %.2lf\n", total);

}return 0;

}

Agradecimento ao amigoEdgar Almeira

Page 70: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

70

Entrada do programaEntrada do programa

Entrada:24mamao 2.19cebola 3.10tomate 2.80uva 2.733mamao 2tomate 1uva 3

Entrada:5morango 6.70repolho 1.12brocolis 1.71tomate 2.80cebola 2.814brocolis 2tomate 1cebola 1morango 1

Agradecimento ao amigoEdgar Almeira

Page 71: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

71

Saída do programaSaída do programa

Saída:R$ 15.37R$ 15.73

Agradecimento ao amigoEdgar Almeira

Page 72: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

72

SetSet

• Set são um tipo de contêineres associativos em que cada elemento deve ser único, porque o valor do elemento o identifica. O valor do elemento não pode ser modificado depois de adicionado ao conjunto, embora seja possível remover e adicionar o valor modificado desse elemento.

https://www.geeksforgeeks.org/set-in-cpp-stl/

Page 73: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

73

SetSet

• Funções associadas ao Set:– begin () -begin () - Retorna um iterador para o primeiro

elemento no conjunto;

– end () -end () - Retorna um iterador ao elemento teórico que segue o último elemento no conjunto;

– size () -size () - Retorna o número de elementos no conjunto;

– max_size () -max_size () - Retorna o número máximo de elementos que o conjunto pode conter;

Page 74: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

74

SetSet

• Funções associadas ao Set:– empty () - empty () - Retorna se o conjunto está vazio;

– par <iterator, bool> insert (const n) - par <iterator, bool> insert (const n) - Adiciona um novo elemento "n" ao conjunto;

– inserção do iterador (iterador position, const n) inserção do iterador (iterador position, const n) - - Adiciona um novo elemento 'n' na posição apontada pelo iterador;

– erase (iterador position) - erase (iterador position) - Remove o elemento na posição apontada pelo iterador;

– erase (const n) - erase (const n) - Remove o valor "n" do conjunto;

– clear () - clear () - Remove todos os elementos do conjunto;

Page 75: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

75

SetSet

• Funções associadas ao Set:– ekey_comp () / value_comp () - ekey_comp () / value_comp () - Retorna o

objeto que determina como os elementos no conjunto são ordenados (‘<’ por padrão);

– find (const n) - find (const n) - Retorna um iterador ao elemento "n" no conjunto, se encontrado, senão retorna o iterador ao final;

– count (const n) - count (const n) - Retorna 1 ou 0 com base no elemento 'n' presente no set ou não;

Page 76: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

76

SetSet

• Funções associadas ao Set:– lower_bound (const n) - lower_bound (const n) - Retorna um iterador

para o primeiro elemento que é equivalente a 'n' ou definitivamente não irá antes do elemento 'n' no conjunto;

– upper_bound (const n) - upper_bound (const n) - Retorna um iterador ao primeiro elemento que é equivalente a 'n' ou definitivamente irá após o elemento 'n' no conjunto.

Page 77: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

77

ProgramaPrograma

#include <bits/stdc++.h>using namespace std;int main() {

freopen("entrada.txt", "r", stdin);set <int> S;set <int> :: iterator it;int i, n, x;scanf("%d", &n);

Page 78: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

78

ProgramaPrograma

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

scanf("%d", &x);S.insert(x);

}printf("Set: ");for (it = S.begin(); it != S.end(); it++){

cout << *it << " ";}cout << endl;return 0;

}

Page 79: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

79

Entrada do programaEntrada do programa

Entrada:740302050301050

Page 80: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

80

Saída do programaSaída do programa

Saída:Set: 10 20 30 40 50

Page 81: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

81

BitsetBitset

• Bitset é um vetor de bool mas cada valor booleano não é armazenado separadamente, em vez disso o bitset otimiza o espaço de modo que cada bool tome apenas 1 bit de espaço, portanto o espaço ocupado pelo bitset bs é menor que o bool bs [N] e vetor bs (N). No entanto, uma limitação do bitset é, N deve ser conhecido em tempo de compilação, ou seja, uma constante (esta limitação não está lá com vector e array dinâmica)

https://www.geeksforgeeks.org/c-bitset-and-its-application/

Page 82: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

82

BitsetBitset

• Como o bitset armazena as mesmas informações de maneira comprimida, a operação no bitset é mais rápida que a do array e vetor. Podemos acessar cada bit de bitset individualmente com a ajuda do operador de indexação de array[] que é bs [3] mostra bit no índice 3 do bitset bs como um array simples. Lembre-se que o bitset inicia sua indexação para trás, que é para 10110, 0 para os índices 0 e 3 e 1 para o primeiro e segundo índices.

https://www.geeksforgeeks.org/c-bitset-and-its-application/

Page 83: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

83

BitsetBitset

• Podemos construir um bitset usando o número inteiro, bem como a string binária via construtores, que é mostrada no código abaixo. O tamanho do bitset é fixo em tempo de compilação ou seja, não pode ser alterado em tempo de execução.

• A função principal definida para a classe de bitset é operator [], count, size, set, reset e muitos mais.

https://www.geeksforgeeks.org/c-bitset-and-its-application/

Page 84: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

84

ProgramaPrograma#include <bits/stdc++.h>using namespace std;int main() {

freopen("entrada.txt", "r", stdin);int i, n, x;bitset <16> B;cout << B << endl;scanf("%d", &n);for (i = 0; i < n; i++){

scanf("%d", &x);cout << x << " - " << bitset<8>(x) << endl;

}return 0;

}

Page 85: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

85

Entrada do programaEntrada do programa

Entrada:6352112010

Page 86: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

86

Saída do programaSaída do programa

Saída:00000000000000003 - 000000115 - 000001012 - 0000001011 - 0000101120 - 0001010010 - 00001010

Page 87: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

87

ProgramaPrograma

#include <bits/stdc++.h>using namespace std;int main() {

bitset<4> bset1(9);bitset<4> bset2(3);cout << bset1 << endl;cout << bset2 << endl;// operador de comparaçãocout << (bset1 == bset2) << endl;cout << (bset1 != bset2) << endl;// operação bitwise e atribuiçãocout << (bset1 ^= bset2) << endl;cout << (bset1 &= bset2) << endl;cout << (bset1 |= bset2) << endl;

Page 88: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

88

ProgramaPrograma

// deslocando para a esquerda e para a direitacout << (bset1 <<= 2) << endl;cout << (bset1 >>= 1) << endl;// operador nãocout << (~bset2) << endl;// operador bit a bitcout << (bset1 & bset2) << endl;cout << (bset1 | bset2) << endl;cout << (bset1 ^ bset2) << endl;return 0;

}

Page 89: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

89

Saída do programaSaída do programa

Saída:1001001101101000100011110001101100001001110101

Page 90: Logo - Universidade Federal de Itajubárcosta62br.unifei.edu.br/escola/EIP_07.pdf · Estrutura de Dados • Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de

90

ExercíciosExercícios

• https://www.urionlinejudge.com.br/judge/en/login

– URI 1110, 1449. Faça os exercícios de Estruturas do URI.