1 / 36

Introdução a Estruturas de Dados Avançadas Utilizando Linguagem C

Introdução a Estruturas de Dados Avançadas Utilizando Linguagem C. Implementação de Fila, Lista e Pilha através de Arranjos Edwar Saliba Júnior 08 a 14 de Julho de 2009. Linguagem de Programação. Linguagem : C/C++ Delphi Pascal .Net C# Java Fortran e etc. Para que elas existem ?

mort
Download Presentation

Introdução a Estruturas de Dados Avançadas Utilizando Linguagem C

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Introdução a Estruturas de Dados Avançadas Utilizando Linguagem C Implementação de Fila, Lista e Pilha através de Arranjos EdwarSalibaJúnior 08 a 14 de Julho de 2009

  2. Linguagem de Programação • Linguagem: • C/C++ • Delphi • Pascal • .Net • C# • Java • Fortran e etc. • Para queelasexistem? • Para resolver problemas!

  3. Problemas… • Quetipo de problemaspodemos resolver com linguagens de programação? • Rotinas • Podemos resolver qualquertipo de rotina? • Exemplos…

  4. Exemplos de Problemas • Cálculo de impostos a pagar. (30% do valor do salário); • Conversão de moedas. (US$ para R$ ou R$ para US$); • Somar 10 númerosquaisquer; • Entrar com as notas de 5 alunos, para 3 etapas. Ao final imprimir o total de cadaaluno.

  5. OutrosProblemas – Como resolvê-los? • Criar um programaquesimuleumalista de supermercado; • Criar um programaparaverificar se a quantidade de “(“, “[“ e “{“, abrindo e fechando, estãocorretasemumaexpressãomatemática; • Criar um programaparacontrolar a fila de um banco.

  6. Exemplo de Problema de Lista • Precisofazer um programaquesimuleumalista de compras; • Como criar um programa (umaestrutrura) para resolver esteproblema? Utilizando um vetor.

  7. Lista - Considerações • Os elementossãosempreintroduzidosnacauda; • Tem ordem de entrada, masnão tem ordem de saída dos elementos; • A lista tem um tamanhomáximo.

  8. Lista Fonte: Ziviani (1996:37)

  9. Quaisoperações se aplicamsobreumaLista? • FazListaVazia (Lista) • Faz uma lista ficar vazia; • InsereNaLista (X, Lista) • Insere o item X após o último item da Lista; • RetiraDaLista (P, Lista, X) • Retorna o item X que está na posição P da Lista, retirando-o da lista e deslocando os itens a partir da posição P + 1 para as posições anteriores; • ListaVazia (Lista) • Retorna VERDADEIRO se Lista estiver vazia e FALSO caso contrário; • ImprimeLista (Lista) • Imprime os itens da lista na ordem de ocorrência.

  10. Algoritmo de Lista #include <cstdlib> #include <iostream> #include <conio.h> #define InicioArranjo 0 #define MaxTam 100 using namespace std; typedefintApontador; typedefstructTipoItem { intCodigo; char Nome[10]; }; typedefstructTipoLista { TipoItem Item [MaxTam]; Apontador Primeiro; Apontador Ultimo; };

  11. Algoritmo de Lista voidFazListaVazia (TipoLista &Lista) { Lista.Primeiro = InicioArranjo; Lista.Ultimo = InicioArranjo; } voidConsultaItem (TipoLista &Lista, TipoItem &Item, Apontador P) { Item.Codigo = Lista.Item [P].Codigo; strcpy (Item.Nome, Lista.Item [P].Nome); } intListaVazia (TipoLista &Lista) { return (Lista.Primeiro == Lista.Ultimo); } voidInserirNaLista (TipoItem X, TipoLista &Lista) { if (Lista.Ultimo > MaxTam) { cout << "Lista cheia!"; } else { Lista.Item [Lista.Ultimo] = X; Lista.Ultimo++; } }

  12. Algoritmo de Lista voidRetiraDaLista (Apontador P, TipoLista &Lista, TipoItem &Item) { if (ListaVazia (Lista) || (P >= Lista.Ultimo)) { cout << "Erro: Posição não existe!"; } else { Item = Lista.Item [P]; Lista.Ultimo--; for (intAux = P; Aux < Lista.Ultimo; Aux++) Lista.Item [Aux] = Lista.Item [Aux + 1]; } } voidInserirListaPosicao (Apontador P, TipoLista &Lista, TipoItem &Item) { if (ListaVazia (Lista) || (P >= Lista.Ultimo)) { cout << "Erro: Posição não existe!"; } else { Lista.Item[P].Codigo = Item.Codigo; strcpy (Lista.Item[P].Nome, Item.Nome); } }

  13. Algoritmo de Lista voidImprimeLista (TipoLista &Lista) { for (intAux = Lista.Primeiro; Aux < Lista.Ultimo; Aux++) { cout << "\nCódigo: " << Lista.Item [Aux].Codigo; cout << "\nNome : " << Lista.Item [Aux].Nome << "\n"; } } int Menu () { intOpcao = 5; do { system ("CLS"); cout << "Escolha uma opção\n"; cout << "=================\n"; cout << "\n 1 - Inserir "; cout << "\n 2 - Excluir "; cout << "\n 3 - Alterar "; cout << "\n 4 - Imprimir "; cout << "\n 0 - Sair\n"; cout << "\nOpção: "; cin >> Opcao; } while ((Opcao < 0) || (Opcao > 4)); return (Opcao); }

  14. Algoritmo de Lista int main(intargc, char *argv[]) { TipoLista Lista; /* Cria uma lista. */ TipoItemAux; /* Auxiliar para entrada de dados. */ intOpcao, Posicao; /* Faz a lista ficar vazia. */ FazListaVazia (Lista); Opcao = Menu (); while (Opcao != 0) { switch (Opcao) { case 1: /* Inserir */ system ("CLS"); cout << "Inserir Item"; cout << "\n============\n\n"; cout << "\nDigite um Código: "; cin >> Aux.Codigo; cout << "\nDigite um Nome: "; cin >> Aux.Nome; InserirNaLista (Aux, Lista); break;

  15. Algoritmo de Lista case 2: /* Excluir */ system ("CLS"); cout << "Excluir Item"; cout << "\n============\n\n"; cout << "\nDigite a posição a ser removida: "; cin >> Posicao; RetiraDaLista (Posicao, Lista, Aux); cout << "\nO item a seguir foi removido da lista:\n\n"; cout << "\nCódigo: " << Aux.Codigo; cout << "\nNome : " << Aux.Nome; break; case 3: /* Alterar */ system ("CLS"); cout << "Alterar Item"; cout << "\n============\n\n"; cout << "\nDigite a posição a ser alterada: "; cin >> Posicao; cout << "\n\n"; ConsultaItem (Lista, Aux, Posicao); cout << "Valores atuais"; cout << "\n==============\n\n"; cout << "Código: " << Aux.Codigo; cout << "\nNome : " << Aux.Nome << "\n";

  16. Algoritmo de Lista cout << "\nDigite o novo Código: "; cin >> Aux.Codigo; cout << "\nDigite o novo Nome : "; cin >> Aux.Nome; InserirListaPosicao (Posicao, Lista, Aux); break; case 4: /* Imprimir */ system ("CLS"); cout << "Itens da Lista"; cout << "\n==============\n\n"; ImprimeLista (Lista); fflush(stdin); getchar(); } Opcao = Menu (); } system("PAUSE"); return EXIT_SUCCESS; }

  17. Exemplo de ProblemaUtilizandoPilha • Criar um programaparaverificar se a quantidade de “(“, “[“ e “{“, abrindo e fechando, estãocorretasemumaexpressãomatemática; • Como criar um programa (umaestrutrura) para resolver esteproblema? Utilizandovetores.

  18. Pilha - Considerações • FILO – First In, Last Out; • Os elementossãointroduzidos um sobre o outro; • Pode-se fazeranalogia a umapilha de pratos. Fig. Pilha de Pratos - Fonte: <http://www.caloni.com.br/blog/archives/basico-do-basico-assembly> Acesso em: 07 jul. 2009

  19. Pilha Fonte: <http://www.linhadecodigo.com.br/ArtigoImpressao.aspx?id=975> Acesso em: 26 nov. 2007

  20. Quaisoperações se aplicamsobreuma FILO? • FazPilhaVazia (Pilha) • Faz uma Pilha ficar vazia; • PilhaVazia (Pilha) • Retorna VERDADEIRO se Pilha estiver vazia e FALSO caso contrário; • Empilhar (X, Pilha) • Insere o item X no topo da Pilha; • Desempilhar (Pilha, X) • Retorna o item X que está no topo da Pilha, removendo-o da Pilha; • TamanhoPilha (Pilha) • Retorna quantos itens existem armazenados na Pilha.

  21. Algoritmo de Pilha #include <cstdlib> #include <iostream> #include <conio.h> #define MaxTam 100 using namespace std; typedefintApontador; typedefstructTipoItem { intCodigo; char Nome[10]; }; typedefstructTipoPilha { TipoItem Item [MaxTam]; Apontador Topo; }; voidFazPilhaVazia (TipoPilha &Pilha) { Pilha.Topo = -1; } intPilhaVazia (TipoPilha &Pilha) { return (Pilha.Topo == -1); }

  22. Algoritmo de Pilha void Empilhar (TipoItem X, TipoPilha &Pilha) { if (Pilha.Topo == MaxTam) { cout << "Pilha cheia!"; } else { Pilha.Topo++; Pilha.Item [Pilha.Topo] = X; } } void Desempilhar (TipoPilha &Pilha, TipoItem &Item) { system("CLS"); if (PilhaVazia (Pilha)) { cout << "Erro: Pilha está vazia!"; Item.Codigo = -1; } else { Item = Pilha.Item [Pilha.Topo]; Pilha.Topo--; } } intTamanhoPilha (TipoPilha &Pilha) { return (Pilha.Topo + 1); }

  23. Algoritmo de Pilha int Menu () { intOpcao = 5; do { system ("CLS"); cout << "Escolha uma opção\n"; cout << "=================\n"; cout << "\n 1 - Empilhar "; cout << "\n 2 - Desempilhar "; cout << "\n 3 - Verificar Tamanho da Pilha"; cout << "\n 0 - Sair\n"; cout << "\nOpção: "; cin >> Opcao; } while ((Opcao < 0) || (Opcao > 3)); return (Opcao); } int main(intargc, char *argv[]) { TipoPilha Pilha; /* Cria uma Pilha. */ TipoItemAux; /* Auxiliar para entrada de dados. */ intOpcao; /* Faz a Pilha ficar vazia. */ FazPilhaVazia (Pilha);

  24. Algoritmo de Pilha Opcao = Menu (); while (Opcao != 0) { switch (Opcao) { case 1: /* Inserir */ system ("CLS"); cout << "Inserir Item"; cout << "\n============\n\n"; cout << "\nDigite um Código: "; cin >> Aux.Codigo; fflush(stdin); cout << "\nDigite um Nome: "; gets (Aux.Nome); Empilhar (Aux, Pilha); break; case 2: /* Excluir */ system ("CLS"); cout << "Excluir Item"; cout << "\n============\n\n"; Desempilhar (Pilha, Aux); if (Aux.Codigo > 0) { cout << "\nO item a seguir foi removido da Pilha:\n\n"; cout << "\nCódigo: " << Aux.Codigo; cout << "\nNome : " << Aux.Nome; }

  25. Algoritmo de Pilha fflush(stdin); getchar(); break; case 3: /* Tamanho da Pilha */ system ("CLS"); cout << "Pilha"; cout << "\n=====\n\n"; cout << "Quantidade de itens na Pilha: " << TamanhoPilha (Pilha); fflush(stdin); getchar(); } Opcao = Menu (); } system("PAUSE"); return EXIT_SUCCESS; }

  26. Exemplo de Problema de Fila • Controlar a fila de um de um banco; • Como criar um programa (umaestrutrura) para resolver esteproblema? Utilizando um vetor.

  27. Fila - Considerações • FIFO – First In, First Out; • Os elementossãointroduzidosnacauda e retiradospelafrente; • A filanãopode “terfim”, ouseja, semprepodemosinserir e retirarelementos; • Vetorestêm um tamanhofixo; • O quefazerentão?

  28. Fila Estática Circular Fonte: <http://sicesumar.wikispaces.com/Fila+est%C3%A1tica+circular?f=print> Acessoem: 07 jul. 2009

  29. Quaisoperações se aplicamsobreuma FIFO? • FazFilaVazia (Fila) • Tornaumafila (pré-existente) vazia; • FilaVazia (Fila) • RetornaVERDADEIRO se a filaestivervazia e FALSO se a filapossuiraomenos um elemento; • InserirNaFila (X, Fila) • Insere o item X nafila; • RetirarDaFila (Fila, X) • Retorna o item X queestá no iníciodafila. Retirando-o desta.

  30. Pulo do Gato • Por ser implementada em forma circular, de acordo com Ziviani (1996:56), existe um pequeno problema: • Não há uma forma de distinguir uma fila cheia de uma vazia, pois nos dois casos os apontadores Frente e Trás apontam para a mesma posição do círculo; • Solução: • Não utilizar todo o espaço da fila, deixando uma posição vazia; • Assim sendo, a fila estará cheia quando o apontador Trás + 1 for igual ao apontador Frente. Isto significa que existirá uma célula vazia entre o fim e o início da fila.

  31. Algoritmo de Fila #include <cstdlib> #include <iostream> #include <conio.h> #define MaxTam 5 using namespace std; typedefintApontador; typedefstructTipoItem { intCodigo; char Nome[10]; }; typedefstructTipoFila { TipoItem Item [MaxTam]; ApontadorFrente; ApontadorTras; }; void FazFilaVazia (TipoFila &Fila) { Fila.Tras = Fila.Frente = 1; } intFilaVazia (TipoFila &Fila) { return (Fila.Frente == Fila.Tras); } void InserirNaFila (TipoItem X, TipoFila &Fila) { Fila.Item [Fila.Tras - 1] = X; Fila.Tras = (Fila.Tras % MaxTam + 1); }

  32. Algoritmo de Fila • void RetiraDaFila (TipoFila &Fila, TipoItem &Item) { • if (FilaVazia (Fila)) { • cout << "\n\nFilavazia!"; • getchar(); • } • else { • Item = Fila.Item [Fila.Frente - 1]; • Fila.Frente = (Fila.Frente % MaxTam + 1); • } • } • int Menu () { • intOpcao = 5; • do { • system ("CLS"); • cout << "Escolhaumaopção\n"; • cout << "=================\n"; • cout << "\n 1 - Inserir "; • cout << "\n 2 - Excluir "; cout << "\n 0 - Sair\n"; cout << "\nOpção: "; cin >> Opcao; } while ((Opcao < 0) || (Opcao > 2)); return (Opcao); }

  33. Algoritmo de Fila int main(intargc, char *argv[]) { TipoFila Fila; /* Criauma Fila. */ TipoItem Aux; /* Auxiliarparaentrada de dados. */ intOpcao; for (int I = 0; I < MaxTam; I++) { Fila.Item [I].Codigo = 0; strcpy (Fila.Item [I].Nome, ""); } /* Faz a Fila ficarvazia. */ FazFilaVazia (Fila); Opcao = Menu (); while (Opcao != 0) { switch (Opcao) { case 1: /* Inserir */ system ("CLS"); if ((Fila.Tras % MaxTam + 1) == Fila.Frente) { cout << "\n\nFilacheia!"; fflush(stdin); getchar(); }

  34. Algoritmo de Fila • else { • cout << "Inserir Item"; • cout << "\n======\n\n"; • cout << "\nDigite um Código: "; • cin >> Aux.Codigo; • cout << "\nDigite um Nome: "; • cin >> Aux.Nome; • InserirNaFila (Aux, Fila); • } • break; case 2: /* Excluir */ system ("CLS"); cout << "Excluir Item"; cout << "\n============\n\n"; RetiraDaFila (Fila, Aux); if (Aux.Codigo != -1) { cout << "\nO item a seguirfoiremovidoda Fila:\n\n"; cout << "\nCódigo: " << Aux.Codigo; cout << "\nNome : " << Aux.Nome; } Aux.Codigo = -1;

  35. Algoritmo Fila fflush(stdin); getchar(); } Opcao = Menu (); } system("PAUSE"); return EXIT_SUCCESS; }

  36. ReferênciaBibliográfica • FILA.GIF, Cucamonga – Blog Rafael Cruz, Disponível em: <http://www.cucamongabr.com/?tag=filas> Acesso em: 06 jul. 2009. • FILACIRCULAR.GIF, Sistemas de Informação, Disponível em: < http://sicesumar.wikispaces.com/Fila+est%C3%A1tica+circular?f=print> Acesso em: 07 jul. 2009. • PRATOS.JPG, Caloni.com.br, Disponível em: < http://www.caloni.com.br/blog/archives/basico-do-basico-assembly> Acesso em: 07 jul. 2009. • PILHA_1.JPG, Linha de Código, Disponível em: < http://www.linhadecodigo.com.br/ArtigoImpressao.aspx?id=975> Acesso em: 26 nov. 2007. • SALIBA JÚNIOR, Edwar. Estruturas de Dados. Disponívelem: < http://www.esj.eti.br/Apostilas/EstruturaDeDados.pdf> Acessoem: 07 jul. 2009. • TODOTATTOO648.JPG, AndAfter.org, Disponível em: <http://www.andafter.org/images/album/design-de-produto/Eu%20Compraria/todotattoo648.jpg> Acesso em: 08 jul. 2009. • ZIVIANI, Nivio. Projeto de Algoritmos : com implementações em Pascal e C. 3ª ed., São Paulo: Pioneira, 1996.

More Related