• Nenhum resultado encontrado

AULA 13 ESTRUTURA DE DADOS

N/A
N/A
Protected

Academic year: 2021

Share "AULA 13 ESTRUTURA DE DADOS"

Copied!
51
0
0

Texto

(1)

AULA 13

ESTRUTURA DE DADOS

Duas pilhas - implementação estática Norton T. Roman & Luciano A. Digiampietri

(2)

Pilha

Pilha é uma estrutura linear na qual:

- As inserções ocorrem no topo da pilha; - As exclusões ocorrem no topo da pilha.

(3)

Duas pilhas

Imagine que estamos organizando um conjunto de

provas e temos que separá-las em dois subconjuntos

Poderíamos criar uma pilha para cada conjunto.

Porém, isto poderia ser um desperdício de recursos

(4)

Duas pilhas

Imagine que estamos organizando um conjunto de

provas e temos que separá-las em dois subconjuntos

Poderíamos criar uma pilha para cada conjunto.

Porém, isto poderia ser um desperdício de recursos

(5)

Duas pilhas

Imagine que estamos organizando um conjunto de

provas e temos que separá-las em dois subconjuntos

Poderíamos criar uma pilha para cada conjunto.

Porém, isto poderia ser um desperdício de recursos

(6)

Duas pilhas - implementação

estática

Utilizaremos um único arranjo de elementos de

tamanho predefinido;

Colocaremos “uma pilha” em cada extremidade do

arranjo;

Controlaremos a posição do elemento que está no

(7)

Duas pilhas - implementação

estática

Utilizaremos um único arranjo de elementos de

tamanho predefinido;

Colocaremos “uma pilha” em cada extremidade do

arranjo;

Controlaremos a posição do elemento que está no

(8)

Duas pilhas - implementação

estática

Utilizaremos um único arranjo de elementos de

tamanho predefinido;

Colocaremos “uma pilha” em cada extremidade do

arranjo;

Controlaremos a posição do elemento que está no

(9)

Ideia

Temos um arranjo de tamanho predefinido

Temos um campo para indicar a posição do elemento que está no topo

Como inserimos o elemento 8 na pilha 2?

(10)

Ideia

Temos um arranjo de tamanho predefinido

Temos um campo para indicar a posição do elemento que está no topo

Como inserimos o elemento 8 na pilha 2?

(11)

Ideia

Temos um arranjo de tamanho predefinido

Temos um campo para indicar a posição do elemento que está no topo

Como inserimos o elemento 8 na pilha 2?

(12)

Ideia

Temos um arranjo de tamanho predefinido

Temos um campo para indicar a posição do elemento que está no topo

Como inserimos o elemento 8 na pilha 2?

(13)

Ideia

Temos um arranjo de tamanho predefinido

Temos um campo para indicar a posição do elemento que está no topo

Como inserimos o elemento 8 na pilha 2?

(14)

Modelagem

#include <stdio.h> #define MAX 50

typedef int TIPOCHAVE; typedef struct { TIPOCHAVE chave; } REGISTRO; typedef struct { REGISTRO A[MAX]; int topo1; int topo2; } PILHADUPLA;

(15)

Modelagem

#include <stdio.h> #define MAX 50

typedef int TIPOCHAVE; typedef struct { TIPOCHAVE chave; } REGISTRO; typedef struct { REGISTRO A[MAX]; int topo1; int topo2; } PILHADUPLA;

(16)

Modelagem

#include <stdio.h> #define MAX 50

typedef int TIPOCHAVE; typedef struct { TIPOCHAVE chave; } REGISTRO; typedef struct { REGISTRO A[MAX]; int topo1; int topo2; } PILHADUPLA;

(17)

Funções de gerenciamento

Implementaremos funções para: Inicializar a estrutura

Retornar a quantidade de elementos válidos Exibir os elementos da estrutura

Inserir elementos na estrutura (push) Excluir elementos da estrutura (pop) Reinicializar a estrutura

(18)

Inicialização

Para inicializar uma pilha já criada pelo usuário, precisamos apenas acertar o valor dos campos

topo1 e topo2.

Já que o topo indicará a posição no arranjo do

elemento que está no topo das pilhas e as pilhas

estão vazias, iniciaremos com os valores topo1=-1

(19)

Inicialização

Para inicializar uma pilha já criada pelo usuário, precisamos apenas acertar o valor dos campos

topo1 e topo2.

Já que o topo indicará a posição no arranjo do

elemento que está no topo das pilhas e as pilhas

estão vazias, iniciaremos com os valores topo1=-1

(20)

Inicialização

void inicializarPilhaDupla(PILHADUPLA* p) { p->topo1 = -1;

p->topo2 = MAX; }

(21)

Inicialização

void inicializarPilhaDupla(PILHADUPLA* p) { p->topo1 = -1;

p->topo2 = MAX; }

(22)

Retornar número de elementos

Podemos utilizar os valores dos campos topo1 e

topo2 para calcular o número de elementos:

Na “pilha 1” há topo1 + 1 elementos válidos;

(23)

Retornar número de elementos

Podemos utilizar os valores dos campos topo1 e

topo2 para calcular o número de elementos:

Na “pilha 1” há topo1 + 1 elementos válidos;

(24)

Retornar número de elementos

Podemos utilizar os valores dos campos topo1 e

topo2 para calcular o número de elementos:

Na “pilha 1” há topo1 + 1 elementos válidos;

(25)

Retornar número de elementos

Podemos utilizar os valores dos campos topo1 e

topo2 para calcular o número de elementos:

Na “pilha 1” há topo1 + 1 elementos válidos;

(26)

Retornar número de elementos

int tamanhoPilhaDupla(PILHADUPLA* p) { return p->topo1 + 1 + MAX - p->topo2; }

(27)

Exibição/Impressão

Para exibir os elementos da estrutura precisaremos

iterar pelos elementos válidos e, por exemplo,

imprimir suas chaves.

Um dos parâmetros da função de impressão irá nos dizer qual das pilhas será exibida.

(28)

Exibição/Impressão

bool exibirUmaPilha(PILHADUPLA* p, int pilha) {

if (pilha < 1 || pilha > 2) return false; printf("Pilha %i: \" ", pilha);

int i;

if (pilha == 1) for (i=p->topo1;i>=0;i--) printf("%i ", p->A[i].chave); else for (i=p->topo2;i<MAX;i++) printf("%i ", p->A[i].chave);

printf("\"\n"); return true;

(29)

Exibição/Impressão

bool exibirUmaPilha(PILHADUPLA* p, int pilha) { if (pilha < 1 || pilha > 2) return false;

printf("Pilha %i: \" ", pilha); int i;

if (pilha == 1) for (i=p->topo1;i>=0;i--) printf("%i ", p->A[i].chave); else for (i=p->topo2;i<MAX;i++) printf("%i ", p->A[i].chave);

printf("\"\n");

return true; }

(30)

Exibição/Impressão

bool exibirUmaPilha(PILHADUPLA* p, int pilha) { if (pilha < 1 || pilha > 2) return false; printf("Pilha %i: \" ", pilha);

int i;

if (pilha == 1) for (i=p->topo1;i>=0;i--) printf("%i ", p->A[i].chave); else for (i=p->topo2;i<MAX;i++) printf("%i ", p->A[i].chave);

printf("\"\n"); return true; }

(31)

Exibição/Impressão

bool exibirUmaPilha(PILHADUPLA* p, int pilha) { if (pilha < 1 || pilha > 2) return false; printf("Pilha %i: \" ", pilha);

int i;

if (pilha == 1) for (i=p->topo1;i>=0;i--) printf("%i ", p->A[i].chave);

else for (i=p->topo2;i<MAX;i++) printf("%i ", p->A[i].chave);

printf("\"\n"); return true; }

(32)

Exibição/Impressão

bool exibirUmaPilha(PILHADUPLA* p, int pilha) { if (pilha < 1 || pilha > 2) return false; printf("Pilha %i: \" ", pilha);

int i;

if (pilha == 1) for (i=p->topo1;i>=0;i--) printf("%i ", p->A[i].chave); else for (i=p->topo2;i<MAX;i++) printf("%i ", p->A[i].chave);

printf("\"\n"); return true; }

(33)

Inserção de um elemento (push)

O usuário passa como parâmetro um registro a ser

inserido na pilha e diz em qual pilha deseja inserir

Se a estrutura não estiver cheia, o elemento será

inserido no topo da respectiva pilha, ou melhor,

(34)

Inserção de um elemento (push)

O usuário passa como parâmetro um registro a ser

inserido na pilha e diz em qual pilha deseja inserir

Se a estrutura não estiver cheia, o elemento será

inserido no topo da respectiva pilha, ou melhor,

(35)

Inserção de um elemento (push)

bool inserirElementoPilha(PILHADUPLA* p, REGISTRO reg, int pilha) {

if (pilha < 1 || pilha > 2) return false; if (p->topo1 + 1 == p->topo2) return false; if (pilha == 1) { p->topo1 = p->topo1+1; p->A[p->topo1] = reg; } else{ p->topo2 = p->topo2-1; p->A[p->topo2] = reg; } return true; }

(36)

Inserção de um elemento (push)

bool inserirElementoPilha(PILHADUPLA* p, REGISTRO reg, int pilha) { if (pilha < 1 || pilha > 2) return false;

if (p->topo1 + 1 == p->topo2) return false; if (pilha == 1) { p->topo1 = p->topo1+1; p->A[p->topo1] = reg; } else{ p->topo2 = p->topo2-1; p->A[p->topo2] = reg; } return true; }

(37)

Inserção de um elemento (push)

bool inserirElementoPilha(PILHADUPLA* p, REGISTRO reg, int pilha) { if (pilha < 1 || pilha > 2) return false;

if (p->topo1 + 1 == p->topo2) return false;

if (pilha == 1) { p->topo1 = p->topo1+1; p->A[p->topo1] = reg; } else{ p->topo2 = p->topo2-1; p->A[p->topo2] = reg; } return true; }

(38)

Inserção de um elemento (push)

bool inserirElementoPilha(PILHADUPLA* p, REGISTRO reg, int pilha) { if (pilha < 1 || pilha > 2) return false;

if (p->topo1 + 1 == p->topo2) return false; if (pilha == 1) { p->topo1 = p->topo1+1; p->A[p->topo1] = reg; } else{ p->topo2 = p->topo2-1; p->A[p->topo2] = reg; } return true; }

(39)

Inserção de um elemento (push)

bool inserirElementoPilha(PILHADUPLA* p, REGISTRO reg, int pilha) { if (pilha < 1 || pilha > 2) return false;

if (p->topo1 + 1 == p->topo2) return false; if (pilha == 1) { p->topo1 = p->topo1+1; p->A[p->topo1] = reg; } else{ p->topo2 = p->topo2-1; p->A[p->topo2] = reg; } return true; }

(40)

Inserção de um elemento (push)

bool inserirElementoPilha(PILHADUPLA* p, REGISTRO reg, int pilha) { if (pilha < 1 || pilha > 2) return false;

if (p->topo1 + 1 == p->topo2) return false; if (pilha == 1) { p->topo1 = p->topo1+1; p->A[p->topo1] = reg; } else{ p->topo2 = p->topo2-1; p->A[p->topo2] = reg; } return true; }

(41)

Exclusão de um elemento (pop)

O usuário solicita a exclusão do elemento do topo

de uma das pilhas:

Se a pilha não estiver vazia, além de excluir esse

elemento da pilha iremos copiá-lo para um local

(42)

Exclusão de um elemento (pop)

O usuário solicita a exclusão do elemento do topo

de uma das pilhas:

Se a pilha não estiver vazia, além de excluir esse

elemento da pilha iremos copiá-lo para um local

(43)

Exclusão de um elemento (pop)

bool excluirElementoPilha(PILHADUPLA* p, REGISTRO* reg, int pilha) {

if (pilha < 1 || pilha > 2) return false; if (pilha == 1) {

if (p->topo1 == -1) return false; *reg = p->A[p->topo1];

p->topo1 = p->topo1 - 1; }else{

if (p->topo2 == MAX) return false; *reg = p->A[p->topo2];

p->topo2 = p->topo2 + 1; }

return true;

(44)

Exclusão de um elemento (pop)

bool excluirElementoPilha(PILHADUPLA* p, REGISTRO* reg, int pilha) { if (pilha < 1 || pilha > 2) return false;

if (pilha == 1) {

if (p->topo1 == -1) return false; *reg = p->A[p->topo1];

p->topo1 = p->topo1 - 1; }else{

if (p->topo2 == MAX) return false; *reg = p->A[p->topo2];

p->topo2 = p->topo2 + 1; }

return true;

(45)

Exclusão de um elemento (pop)

bool excluirElementoPilha(PILHADUPLA* p, REGISTRO* reg, int pilha) { if (pilha < 1 || pilha > 2) return false;

if (pilha == 1) {

if (p->topo1 == -1) return false; *reg = p->A[p->topo1];

p->topo1 = p->topo1 - 1; }

else{

if (p->topo2 == MAX) return false; *reg = p->A[p->topo2];

p->topo2 = p->topo2 + 1; }

return true;

(46)

Exclusão de um elemento (pop)

bool excluirElementoPilha(PILHADUPLA* p, REGISTRO* reg, int pilha) { if (pilha < 1 || pilha > 2) return false;

if (pilha == 1) {

if (p->topo1 == -1) return false; *reg = p->A[p->topo1];

p->topo1 = p->topo1 - 1; }else{

if (p->topo2 == MAX) return false; *reg = p->A[p->topo2];

p->topo2 = p->topo2 + 1; }

return true;

(47)

Exclusão de um elemento (pop)

bool excluirElementoPilha(PILHADUPLA* p, REGISTRO* reg, int pilha) { if (pilha < 1 || pilha > 2) return false;

if (pilha == 1) {

if (p->topo1 == -1) return false; *reg = p->A[p->topo1];

p->topo1 = p->topo1 - 1; }else{

if (p->topo2 == MAX) return false; *reg = p->A[p->topo2];

p->topo2 = p->topo2 + 1; }

return true; }

(48)

Reinicialização da pilha

Para esta estrutura, para reinicializar as pilhas basta

acertar os valores de topo1 e topo2 ou chamarmos

(49)

Reinicialização da pilha

Para esta estrutura, para reinicializar as pilhas basta

acertar os valores de topo1 e topo2 ou chamarmos

(50)

Reinicialização da pilha

void reinicializarPilha(PILHADUPLA* p) { p->topo1 = -1; p->topo2 = MAX; } void reinicializarPilha2(PILHADUPLA* p) { inicializarPilhaDupla(p); }

(51)

AULA 13

ESTRUTURA DE DADOS

Duas pilhas - implementação estática Norton T. Roman & Luciano A. Digiampietri

Referências

Documentos relacionados

Dessa forma, o aluno que seleciona a alternativa demonstra uma boa interpretação do texto-base ao responder o comando do enunciado.. Dessa forma, o aluno que seleciona a

As simula¸c˜ oes foram feitas para uma rede de 3×3 clusters separados centro a centro por 160 nm, s˜ ao equivalentes ` a medidas de FMR fora do plano da amostra e tem como

Completa quanto aos fatores utilizados no tratamento Adoção da situação paradigm 2 Quantidade mínima de dados de mercado, efetivamente utilizados 12 5 3 3

2) Fica a critério da banca examinadora, somente para o caso de mais de um candidato realizando o concurso, atribuir ao candidato que obtiver a maior pontuação na Soma Absoluta 3

10 unidades.. Meios de Comunicação | 12 unidades.. Animais Diversos para Colorir | 100. 20 unidades.. Meios de Transportes Animados | 009 12 unidades. interativo) 28

Outras atividades como essa questão podem ser propostas, mas lembramos que não interessa tanto, nesse caso, a realização de muitos cálculos, quanto, por exemplo,

No projeto, o levantamento florístico identificou mais de 130 espécies medicinais dentro da área de estudo (Estações Ecológica e Experimental de Itirapina).. Para o Guia Ilustrado

Participação do setor na arrecadação do tributo é de apenas 0,11% Participação do setor na arrecadação do tributo é de apenas 0,11% Participação do setor na arrecadação