fila pilha lista deque

Download Fila Pilha Lista Deque

Post on 07-Jun-2015

7.344 views

Category:

Documents

1 download

Embed Size (px)

DESCRIPTION

Material dado pela professora Juliana do Nascimento, que descreve como funciona'com exemplos.rsrs' fila, pilha, lista e deque em C.

TRANSCRIPT

Estruturas de dados clssicasVetores ou arrays Vetores, ou arrays, so estruturas de dados lineares e estticas, isto , so compostas por um nmero fixo (finito) de elementos de um determinado tipo de dados. O espao de memria utilizado alocado em tempo de compilao (declarao das variveis), ou seja, quando o programa comea a ser executado, as variveis do tipo vetor j esto alocadas na memria com o nmero total de elementos. O tempo de acesso aos elementos de um vetor muito rpido, sendo considerado constante: os elementos so acessados pelo seu ndice no vetor. Porm, a remoo de elementos pode ser custosa se no for desejvel que haja espaos "vazios" no meio do vetor, pois nesse caso necessrio "arrastar" de uma posio todos os elementos depois do elemento removido. Essa uma estrutura muito recomendada para casos em que os dados armazenados no mudaro, ou pouco mudaro, atravs do tempo.

ListaA Lista uma estrutura de dados linear, composta por uma sequncia de ns ou nodos. Existem duas formas de representar as listas: - Alocao sequencial: os ns ocupam posies sequenciais contguas. - Alocao dinmica (encadeada): os ns (celulas) apontam para o prximo elemento da lista. Diferentemente dos vetores, na alocao dinmica a reserva de memria para cada clula (n) ocorre em tempo de execuo do programa. Neste caso, a quantidade mxima de ns em uma lista ser determinada pelo tamanho de memria disponvel no computador. Outra vantagem da alocao dinmica sobre a seqencial que o gasto de memria proporcional ao nmero de ns da lista. Por exemplo, se a lista tiver apenas dois ns, sero gastos bytes de memrias referentes a estes dois ns. Para trabalhar com uma lista dinmica (ligada), devemos guardar o primeiro elemento da lista. Lista simplesmente encadeada (LSE): cada n da lista ponta para o prximo n. A LSE s pode ser percorrida em um nico sentido Lista duplamente encadeada (LDE): cada n da lista aponta para o n anterior e posterior. A LDE pode ser percorrida em ambos os sentidos Lista Circular: O primeiro n aponta para o ltimo e o ltimo aponta para o primeiro.

Noes da Linguagem C

pg 1

Pilha. uma lista linear em que todas as inseres, as remoes e os acessos so feitos em uma nica extremidade, chamada topo. So baseadas no princpio LIFO (last in, first out) ou UEPS (ltimo a entrar, primeiro a sair) onde os dados que foram inseridos por ltimo na pilha sero os primeiros a serem removidos. Existem duas funes que se aplicam a todas as pilhas: PUSH, que insere um dado no topo da pilha, e POP, que remove o item no topo da pilha. Exemplos de pilhas so as pilhas de pratos, pilhas de livros, etc.

Exemplo:Considere a pilha abaixo: 13 19 14 10 Qual ser seu o estado final, aps executar as seguintes instrues: Pop x Pop y Pop z Push y Push x Push z

14 13 19 10

Resposta:

Noes da Linguagem C

pg 2

Qual ser o estado final das pilhas abaixo, aps executar as seguintes instrues: 4 3 2 1 A B C

Push(B,pop(A)) Push(C,pop(A)) Push(B,pop(A)) Push(C,pop(A)) Push(A,pop(B)) Push(C,pop(B)) Push(C,pop(A)) 2 4 1 3 A Resposta: B C

Noes da Linguagem C

pg 3

FilaAs filas so estruturas baseadas no princpio FIFO (first in, first out) ou PEPS (Primeiro a entrar, primeiro a Sair) em que os elementos que foram inseridos no incio so os primeiros a serem removidos. Uma fila possui duas funes bsicas: ENQUEUE (incluir - INC), que adiciona um elemento ao final da fila, e DEQUEUE (retirar - DEL), que remove o elemento no incio da fila. Ex: fila de bancos,A poltica de insero e remoo em filas conhecida como: A) B) C) D) E) FILO LIFO UEPS LILO FIFO Resposta: E A poltica de insero e remoo em pilhas conhecida como: A) B) C) D) E) LIFO FILO PEPS LILO FIFO Resposta: A

Qual ser o estado final da Fila abaixo aps executar as instrues:

inicio

Y

F

C

INC X INC T DEL DEL INC R INC J DEL

Resposta: CXTR-J

Deque de entrada restrita: A remoo poder ser feita por qualquer extremidade, porm as incluses podem ser feitas apenas por uma. Deque de sada restrita: A incluso poder ser feita por qualquer extremidade, porm as remoes podem ser feitas apenas por uma.

Noes da Linguagem C

pg 4

Noes da Linguagem C

pg 5

Estruturas de Dados Encadeadas Dinmicas - Implementao FsicaListas Simplesmente Encadeadas (LSE) A grande diferena da lista para as outras estruturas de dados, que as listas no possuem critrio de incluso e remoo de dados. Uma lista encadeada tem necessariamente uma varivel ponteiro apontando para o seu primeiro elemento. Essa varivel ser utilizada sempre, mesmo que a lista esteja vazia, e dever apontar sempre para o incio da lista (primeiro elemento). Caso esta primeira varivel no seja atualizada corretamente (no caso da incluso de um elemento na primeira posio), a lista poder se perder na memria e no ser mais acessvel. Um elemento da lista composto de duas partes: a informao propriamente dita e uma conexo com o prximo elemento. So chamadas de simplesmente encadeadas porque possuem somente o endereo do seu prximo (prximo elemento).

typedef struct celula { int dados; struct celula *proximaCelula; }tipoCelula;

/* campo para os dados */ /* ponteiro para a proxima celula */ /* nome do novo tipo de estrutura */

Uma lista encadeada toda alocada dinamicamente. Sabemos que a memria alocada dinamicamente no possui um nome como acontece nas variveis comuns, portanto, todas as listas devem possuir uma varivel padro, do tipo ponteiro, que vai apontar para o seu inicio. Uma vez que o primeiro elemento ser uma clula, e cada clula uma estrutura, ento a varivel que apontar para o incio da lista ser um ponteiro de estrutura. A varivel incio mostrada na figura acima ser ento definida como: TipoCelula * inicio; /* ponteiro para uma estrutura tipoCelula */

Uma vez que a lista no possui elementos ainda, ento: inicio = NULL; Para uma lista vazia (sem clulas), a varivel inicio possui valor NULL:

Noes da Linguagem C

pg 6

Incluindo o primeiro elemento (primeira clula): TipoCelula aux; /* variavel auxiliar: ponteiro para uma estrutura tipoCelula

Para reservar memria para nova clula, utilizamos o comando malloc aux = malloc (sizeof (tipoCelula)); Temos ento:

e precisamos atualizar os ponteiros para que a lista receba seu primeiro elemento. Sendo assim: 1) aux->proximaCelula = NULL; // atribui NULL ao campo proximacelula da clula apontada por aux 2) inicio = aux; // copia o endereco de aux em inicio

2

Para inserir dados nesta primeira clula, podemos utilizar o ponteiro aux, que permanece apontando para a clula. aux->dados = 10; /*atribui o valor 10 ao campo dados da clula pontada por aux

Obs: Cada clula de uma lista tambm chamada de n ou nodo O programa a seguir cria uma lista com trs ns, conforme exibida a abaixo

iniciomatricula proximo

1 1

2

3

1

Noes da L inguagem C

7

p

#include #include main( ) { typedef struct no {int matricula; stuct no *proximo; } tipoNo; tipoNo *inicio, *novo, *atual;

/* cria o primeiro registro (nodo 1) */ novo = malloc(sizeof (tipoNo)); /* aloca o n na memria */ novo->matricula = 1; /* atribui 1 para amatrcula */ novo->proximo = NULL; /* NULL = Fim */ inicio = novo; /* inicio aponta para o primeiro n */ atual = novo; /* cria o segundo registro (nodo 2) */ novo = malloc(sizeof (tipoNo)); /* instancia o segundo n */ novo->matricula = 2; novo->Proximo = NULL; /* NULL = Fim */ atual->proximo = novo; /* n anterior aponta para o segundo lista */ atual = novo; /* cria o terceiro registro (n 3) */ novo = malloc(sizeof (tipoNo)); /* instancia o terceiro n */ novo->matricula = 3; novo->Proximo = NULL; /* NULL = Fim */ atual->proximo = novo; /* n anterior aponta para o segundo lista */ atual = novo; /* exibe os ns da lista */ atual = inicio; while (atual != NULL) { printf("\n matricula = %d ",atual->matricula); atual=atual->proximo; } getchar();

}

Noes da L inguagem C

8

p

O programa abaixo cria uma lista dinmica (FILA) com 5 ns, contendo as matrculas: 1, 2, 3, 4, e 5, respectivamente.#include "stdio.h" #include main() { typedef struct no {int matricula; struct no *proximo; }tipoNo; tipoNo *inicio, int i; clrscr(); *novo, *atual;

inicio = atual = NULL; for (i=1;imatricula = i; novo->proximo=NULL; if (inicio == NULL) inicio = novo; else atual->proximo = novo; atual = novo; /* exibe a lista */ atual = inicio; while (atual != NULL) { printf("\n matricula = %d ",atual->matricula); atual=atual->proximo; } getch(); }

}

Inicio matricula prox

1 1

2

3

4

5

Noes da L inguagem C

9

p

O programa abaixo cria uma lista dinmica (tipo Pilha) com 3 ns, contendo as matrculas: 1, 2, e 3.topo

#include main() { typedef struct no {int matricula; struct no *proximo; }tipoNo; tipoNo clrscr(); *topo, *novo,

matriculaaprox

3

2

1

*atual;

/* inclui primeiro registro na pilha */ novo = malloc(sizeof(tipoNo)); novo->matricula = 1; novo->proximo = NULL; topo = novo; /* inclui segundo registro na pilha */ novo = malloc(sizeof(tipoNo)); novo->matricula = 2; novo->proximo = topo; topo = novo; /* inclui terceiro registro na pilha */ novo = malloc(sizeof(tipoNo)); novo->matricula = 3; novo->proximo = topo; topo = novo; /* exibe os registros da pilha */ atual = topo; while (atual != NULL) { printf("\n matricula = %d ",atual->matricula); atual=atual->proximo; } getch(); }

Ser exibido:

matricula = 3 matricula = 2 matricula = 1

Noes da L inguagem C

10

pg

O programa abaixo cria uma lista encadeada do tipo Pilha, com as matrculas, 1, 2,3,4 e 5. #include "stdio.h" main() {