- Estruturas e aplicaçõesprofessor.ufabc.edu.br/~g.mota/courses/programacao_estruturada... · é...

Preview:

Citation preview

1

- Estruturas e aplicações

MCTA028 – Programação Estruturada

Luiz Rozante

3Q-2018

Material preparado a partir de slides dos profs. Jesús Mena-Chalco e Fabrício Olivetti

2

Estruturas (=registros)

3

Linguagem C: Tipos de dados

Tipos de dados primários.Tipos de dados derivados.Tipos definidos pelo usuário.

(*) Fonte: http://www.studytonight.com/c/datatype-in-c.php

Para definir e usar um tipo de usuário

Definição

Declaração

Acesso

Em C, structs permitem definir tipos de dados como umacomposição de tipos já existentes.

O uso de tipos de usuário exige três “passos”:

Definição de tipo de usuário

Podemos definir (“dizer como é”) um tipo novo usando tipos já existentes (definidos ou pré-definidos).

Forma geral:

struct nome_tipo { nome_tipo_1 nome_membro_1; nome_tipo_2 nome_membro_2; ... nome_tipo_k nome_membro_k; };

Declaração de variáveis de tipo de usuário

Declaramos uma variável de tipo definido (de usuário) da mesma forma que declaramos uma de tipo pré-definido.

struct nome_tipo nome_var;

Definição e declaração de tipos de usuário com a cláusula typedef (redefinidor de nomes de tipo).

Forma geral:

typedef struct {

nome_tipo_1 nome_membro_1;

nome_tipo_2 nome_membro_2;

...

nome_tipo_k nome_membro_k;

}nome_tipo_novo;

nome_tipo_novo nome_var;

definição

declaração

Acesso a variáveis de tipo de usuário

O acesso aos membros (campos) de variáveis declaradas a partir de tipo de usuário (definido) é feito através do operador de acesso:

– ponto (´.´), – seta (' -> '), se ponteiro para estrutura (registro).

9

Estruturas

1. #include <stdio.h>2.3. struct ALUNO { //Definição da estrutura4. float nota;5. int cod;6. char conceito;7. };

1. void main() {2. int i;3. struct ALUNO jose, ana; // Declara variáveis4. struct ALUNO turma[7]; // do tipo ALUNO5. jose.nota = 7.0; // Acessa membros da6. jose.cod = 1212; // variável jose7. if (jose.nota < 7.0) { 8. jose.conceito = ‘R’; 9. } 10. else {11. jose.conceito = ‘A’; 12. }13. 14. for (i=0 ; i<=6 ; i++) {15. turma[i].cod = 100 + i; • turma[i].nota = 0.0;1. }2. }

1. #include <stdio.h>2. struct FICHA { //Definição da estrutura FICHA3. char nome[40];4. int cod;5. float salario;6. };

1. void le_cadastro();

1. /* declara um vetor tipo FICHA */ 2. struct FICHA cadastro[100];

1. void main() { le_cadastro(); }

1. void le_cadastro() {2. int i;3. for (i=0 ; i<=99 ; i++) {4. printf(“Nome = “);5. gets(cadastro[i].nome);6. printf(“\n “);7. printf(“Código = “);8. scanf(“%d\n”, &cadastro[i].cod);• printf(“\n “);1. printf(“Salário = “);• scanf(“%f\n”, &cadastro[i].salario);1. }2. }

1)

1. #include <stdio.h>2. #include <conio.h>3. struct DATA { //Definição da estrutura DATA4. int dia;5. char mes[10];6. int ano;7. };

1. struct VENDA { //Definição da estrutura VENDA 2. int cod;3. int qtde;4. float preco;5. struct DATA dt_venda;6. };

1. void impr_venda();2. void impr_vendaS();

1. /* inicialização da variável x tipo VENDA */2. struct VENDA x={12,10,23.4,{5,”Mar”,2002}};

1. /* declaração de uma matriz tipo VENDA */2. struct VENDA reg_venda[1000];

1. void main() {2. impr_venda();3. impr_vendaS();4. }

2)

24. void impr_venda() {25. printf(“Cod= %d\n”, x.cod);26. printf(“Qtde= %d\n”, x.qtde);27. printf(“Preço= %f\n”, x.preco);28. printf(“Data da venda = %d/%s/%d ”,29. x.dt_venda.dia, 30. x.dt_venda.mes, 31. x.dt_venda.ano);32. }

24. void impr_vendaS() {25. int i;26. for (i=0 ; i<=999 ; i++) {27. printf(“Cod = %d\n”,reg_venda[i].cod);28. printf(“Qtde= %d\n”,reg_venda[i].qtde);29. printf(“Preço=%f\n”,reg_venda[i].preco);30. printf(“Data da venda = %d/%s/%d ”,31. reg_venda[i].dt_venda.dia, 32. reg_venda[i].dt_venda.mes, 33. reg_venda[i].dt_venda.ano);34. }35. }

2)

14

Estruturas

Operador de acesso indireto

Tipos abstratos de dados (TAD)

Para resolver um problema é necessário escolher uma abstração da realidade, em geral mediante a definição de um conjunto de dados que representa a situação real

A seguir, deve ser escolhida a forma de representar esses dados

A escolha da representação dos dados é determinada, entre outras, pelas operações a serem realizadas sobre os dados

15

Exemplo de TAD: Listas Lineares ● Sequência de zero ou mais itens x1, x2, ... , xn, na qual

xi é de um determinado tipo e n representa o tamanho da lista linear

● Sua principal propriedade estrutural envolve as posições relativas dos itens em uma dimensão

– Assumindo n >= 1, x1 é o primeiro item da lista e xn é o último item da lista

– xi precede xi+1 para i = 1, 2, . . ., n – 1– xi sucede xi-1 para i = 2, 3, . . ., n – o elemento xi é dito estar na i-ésima posição da lista

16

Listas Lineares

● Muitas aplicações

● Principal aplicação: representação interna de conjuntos.

17

Listas Lineares: Implementações

● Pode ser implementada de diferentes maneiras– Estática

● todo o espaço de memória a ser utilizado (para armazenar os itens) é reservado (alocado) no início da execução do programa ou módulo

● esse espaço de memória permanece reservado durante toda a execução do programa, independente de estar sendo efetivamente utilizado ou não

– Dinâmica● o espaço de memória a ser utilizado (para armazenar

os itens) pode ser reservado (alocado) no decorrer da execução de um programa ou módulo, quando for efetivamente necessário

● o espaço reservado pode ser liberado durante a execução do programa, quando não for mais necessário

18

Listas Lineares - Estática

● Podem dispor os seus elementos de maneira

– Seqüencial: os itens ficam, necessariamente, em sequência (um ao lado do outro) na memória

– Encadeada: os itens não estão, necessariamente, em posições de memória adjacentes (sequência lógica ou virtual)

19

Listas Lineares – Estática Seqüencial● Os itens da lista são armazenados

em posições contíguas de memória● A lista pode ser percorrida em

qualquer direção● A inserção de um novo item pode ser

realizada após o último item com custo constante O(1)

● A inserção de um novo item no meio da lista requer um deslocamento de todos os itens localizados após o ponto de inserção O(n)

● Retirar um item do início da lista requer um deslocamento de itens para preencher o espaço deixado vazio O(n)

20

ItensÍndices

X1

X2

Xn

MaxTam

1

2

n

.

.

.

.

.

.

Listas Lineares – Estática Seqüencial (TAD)

● Para a definição de um TAD, o conjunto de operações a ser definido depende de cada aplicação

● Exemplos:– 1. Criar uma lista linear vazia– 2. Inserir um novo item imediatamente após o i-ésimo item– 3. Retirar o i-ésimo item– 4. Localizar o i-ésimo item para examinar e/ou alterar o

conteúdo de seus componentes.– 5. Combinar duas ou mais listas lineares em uma lista única– 6. Partir uma lista linear em duas ou mais listas– 7. Fazer uma cópia da lista linear– 8. Ordenar os itens da lista em ordem ascendente ou

descendente, de acordo com alguns de seus componentes– 9. Pesquisar a ocorrência de um item com um valor

particular em algum componente21

Listas Lineares – Estática SeqüencialVantagens/Desvantagens

● Vantagens– acesso direto indexado a qualquer elemento da lista – tempo constante para acessar o i-ésimo item - dependerá

somente do índice

● Desvantagens – movimentação quando o item é eliminado/inserido– tamanho máximo pré-estimado

● Diante disso, quando usar?– listas pequenas – inserção/remoção no fim da lista – tamanho máximo bem definido

22

MC-1424 Algoritmos e Estruturas de Dados I - 2° trimestre de 2009

Listas Lineares – Estática Seqüencial Programa em C

#include <stdio.h>

#include <stdlib.h>

#define TAM_MAX 5

#define NULO -9999999

int insere (int lista[], int *n, int chave);

int remove_final (int lista[], int *n);

int remove_inicio (int lista[], int *n);

int imprime (int lista[], int n);

char menu(void);

main()

{

int lista[TAM_MAX];

int num_atual = 0;

...

}

23

Listas Lineares – Estática Seqüencial Função: Inserir no final

int insere (int lista[], int *n, int chave)

{

if (*n == TAM_MAX) return (NULO);

lista[(*n)++] = chave;

return (0);

}

24

Listas Lineares – Estática Seqüencial Função: Remover do final

int remove_final (int lista[], int *n){ if (*n == 0) return (NULO); return (lista[--(*n)]);}

25

Listas Lineares – Estática Seqüencial Função: Remover do início

int remove_inicio (int lista[], int *n){ int i, primeiro; if (*n == 0) return (NULO); primeiro = lista[0]; for (i=1; i < *n; i++) lista[i-1]= lista[i]; (*n)--; return primeiro;} Complexidade: (?)

26

Listas Lineares – Estática Seqüencial Função: Imprimir lista

int imprime (int lista[], int n){ int i; if (n == 0) printf ("Lista vazia!\n"); else { printf ("%d elementos na lista\n", n); for (i=0; i < n; i++) printf ("Elemento %d = %d\n", i+1, lista[i]);

} return (0);}

27

Listas Lineares – Estática Seqüencial Função: Busca lista

Exercício: Como seria a função de busca na lista ?

28

Listas Lineares – Estática Seqüencial Função: Busca lista

Exercício: Como seria a função de busca na lista ?

int busca (int lista[], int n, int chave){int i, achou = 0;

if (n == 0) return(achou); else { for(i = 0;i < n; i++){ if(lista[i] == chave) achou = 1; } return (achou);}

29

Algumas implementações possíveis

● Na forma Dinâmica como ponteiros de nós, a lista pode ser implementada de várias formas, por exemplo:

– Lista Encadeada Simples

– Lista com Descritor

– Lista Duplamente Encadeada

30

Lista Dinâmica Encadeada● Numa lista encadeada, um espaço de memória é alocado para cada

novo elemento (item) inserido na estrutura– O espaço total de memória é proporcional ao número de

elementos– Não há garantia de que os elementos da lista ocuparão espaço de

memória contíguo não há acesso direto aos elementos● Para percorrer todos os elementos da lista é necessário guardar o

seu encadeamento– Armazena-se, junto com a informação de cada elemento, um

ponteiro para o próximo elemento da lista

31

Info1 Info2 Info3

Prim

NULL

Lista Dinâmica Encadeada

32

● Os itens da lista são nós com um dos componentes destinado a guardar o endereço do nó sucessor

● Ex: L = anta, cabra, gato, pato, rato

● onde cada nó é:

– Diz-se que cada nó aponta para o próximo nó– O próximo do último nó é um apontador para NULL– É necessário um apontador para o primeiro nó da lista

Lista Dinâmica Encadeada Estrutura auto-referenciada

33

● Exemplo: o nó de uma lista para armazenar números inteiros pode ser representado em C

struct {

int info;

struct no *proximo;

}no;

● Estrutura auto-referenciada possui um campo que é um ponteiro para uma próxima estrutura do mesmo tipo

● Essa estrutura representa um nó da lista, e a estrutura de lista encadeada é representada pelo ponteiro para o primeiro elemento

Lista Dinâmica Encadeada TAD

● Para a definição de um TAD, o conjunto de operações a ser definido depende de cada aplicação

● Exemplos:– 1. Criar uma lista vazia– 2. Verificar se a lista está vazia– 3. Inserir um novo item no início da lista– 4. Inserir um novo item no final da lista– 5. Retirar um item da lista no começo– 6. Retirar um item da lista no fim– 7. Buscar um item na lista– 8. Imprimir os itens da lista– 9. Determinar o comprimento da lista– 10. Liberar a lista– ...

34

Lista Dinâmica Encadeada Simples Análise de algumas operações

● Função de inserção no início da lista– Para cada elemento inserido é necessário alocar dinamicamente

a memória necessária– Nota importante: o ponteiro que representa a lista deve ter seu

valor atualizado

35

Info1 Info2 Info3

Prim

NULL

Novo

Lista Dinâmica Encadeada Simples Análise de algumas operações

● Função que retira um elemento da lista– Duas situações tem que ser consideradas

● (a) Remoção no início da lista● (b) Remoção no “meio“ da lista

36

Info1 Info2 Info3

Prim

NULL

Info1 Info2 Info3

Prim

NULL

(a)

(b)

Lista encadeada (código): tipos e ponteiros

1. #include <stdio.h>2. #include <stdlib.h>

3. typedef struct {4. int valor;5. struct nodo *prox;6. }nodo;

7. nodo *prim;8. nodo *p;9. nodo *q;

10. void cria_lista_vazia();11. void verifica_se_lista_vazia();12. void inclui_inicio(int x);13. void inclui_fim(int x);14. void imprime_lista();15. void remove_inicio();16. void remove_fim();

Código: main

1. int main(int argc, char** argv) {2. cria_lista_vazia();3. printf("\n");4. verifica_se_lista_vazia();5. inclui_inicio(10);6. inclui_inicio(12);7. inclui_fim(30);8. inclui_fim(40);9. remove_inicio();10. remove_fim();11. imprime_lista();12. return (EXIT_SUCCESS);13.}

Código: cria lista vazia

1. void cria_lista_vazia(){

2. prim = NULL;

3. printf("criei lista vazia\n");

4. }

Código: verifica se é vazia

1. void verifica_se_lista_vazia(){2. if (prim == NULL){3. printf("a lista está lista vazia\n");4. printf("prim = %p \n", prim);5. }6. else {7. printf("a lista NÃO está vazia");8. printf("prim = %p \n", prim);9. }10.}

Código: inserir no início

1. void inclui_inicio(int x){

2. if ((p = (struct nodo*) malloc(sizeof(nodo))) == NULL) {3. printf(" nao consegui alocar memoria para p\n");4. exit(0);5. }

6. p->prox = prim;7. p->valor = x;8. prim = p;9. }

Código: inserir no fim

1. void inclui_fim(int x){

2. if ((p = (struct nodo*) malloc(sizeof(nodo))) == NULL) {3. printf(" nao consegui alocar memoria para p\n");4. exit(0);5. }

6. q = prim;7. while (q->prox != NULL){8. q = q->prox;9. }

10. p->valor = x;11. q->prox = p;12. p->prox = NULL;

13.}

Código: excluir no começo

1. void remove_inicio(){

2. p = prim->prox;

3. free(prim);

4. prim = p;

5. }

Código: excluir no fim

1. void remove_fim(){2. q = prim->prox;3. while (q->prox != NULL){4. p = q;5. q = q->prox;6. }7. free(q);8. p->prox = NULL;9. }

Código: imprimir

1. void imprime_lista(){2. p = prim;3. do {4. printf(" %d ", p->valor);5. p = p->prox;6. }while (p->prox != NULL);7. printf(" %d ", p->valor);8. printf("\n");

9. }

Comparação entre as estratégiasEstática Seqüencial vs. Dinâmica Encadeada

46

● Quando é melhor utilizar uma implementação ou outra?

– Principais características que devem ser consideradas● A implementação estática (array) requer a

especificação do tamanho máximo da lista em tempo de compilação. Se não for possível especificar o tamanho máximo que a lista pode atingir, seria mais adequado escolher a implementação dinâmica

● A implementação estática pode desperdiçar espaço. A implementação dinâmica requer espaço para os ponteiros em cada célula. Em diferentes circunstâncias um método pode acabar utilizando mais espaço do que o outro

Comparação entre as estratégiasEstática Seqüencial vs. Dinâmica Encadeada

47

● Quando é melhor utilizar uma implementação ou outra?

– Principais características que devem ser consideradas● Algumas operações são mais custosas em uma

implementação e não na outra

– Inserção e deleção no início tempo constante na implementação dinâmica encadeada, mas tempo proporcional ao número de elementos na implementação estática

– No final tempo constante na implementação estática, mas tempo proporcional ao número de elementos na implementação dinâmica encadeada

Lista Dinâmica Encadeada Alguns Problemas

● Caracteriza-se por formar um encadeamento simples entre os elementos– Cada elemento armazena um ponteiro para o próximo elemento

da lista● Problemas dessa estratégia

– Não temos como percorrer a lista em ordem inversa de maneira eficiente

– Dificulta a retirada de um elemento da lista. Mesmo se tivermos o ponteiro para o elemento que se deseja retirar, temos que percorrer a lista para encontrar o elemento anterior

● Solução– Lista com descritor?– Lista Dinâmica Duplamente Encadeada

48

Outro exemplo de TAD: Pilhas

49

Pilhas

É a estrutura de dados mais utilizada em programação, sendo inclusive implementada diretamente pelo hardware da maioria das máquinas modernas

A idéia fundamental da pilha é que todo o acesso a seus elementos é feito por meio do seu topo

É um conceito semelhante a qualquer tipo de pilha: pratos, livros, CDs, etc

50

Pilhas (Stacks)

Estrutura de dados com a característica LIFO

LIFO: Last-In First-Out

O último a entrar é o primeiro a sair

Funcionamento

O primeiro item inserido na pilha fica no fundo, sendo o último a ser removido

Todos os itens inseridos na pilha são colocados em cima dos itens anteriores

O último item inserido na pilha é o que está no topo, sendo topo, sendo o primeiro a ser removido

51

Pilhas (Stacks)

Para que serve? Para modelar situações em que é preciso “guardar

para mais tarde” vários elementos, e “lembrar” sempre do último elemento armazenado (LIFO)

52

Pilhas (animação)

53MC-1424 Algoritmos e Estruturas de Dados I - 2° trimestre de 2009http://www.cosc.canterbury.ac.nz/people/mukundan/dsal/StackAppl.html

Características de Pilhas

Dados somente podem ser colocados no topo da pilha

Dados somente podem ser removidos do topo da pilha

Dados somente podem ser removidos do fundo da pilha se existe somente um elemento na pilha

Dados não podem ser removidos do meio da pilha sem antes remover todos os itens anteriores (do topo)

54

Operações de uma Pilha

Principais

Empilha (push) Desempilha (pop)

Auxiliares

Topo (peek) Vazia (isEmpty) Cheia (isFull) Procura (search)

55

Implementação de Pilhas

Lista Estática Seqüencial (Array)

Fácil de implementar Tamanho limitado

Lista Dinâmica Encadeada

Implementação mais complexa Sem limitação de tamanho (memória do

computador) Memória alocada dinamicamente Listas encadeadas que se insere e remove do início

são pilhas

56

Pilha em Lista Estática Seqüencial

PILHA - lista estática seqüencial que implementa pilha o elemento 0 será definido como o fundo da pilha topo da pilha: TOPO é o índice que indica a 1a. posição

livre da pilha Ppilha vazia: TOPO = 0 restrição: tamanho máximo

1o. elem.

2o. elem.

3o. elem.

4o. elem.

3

57

3

2

1

0

Pilha em C – Exemplo (1)

#define MAX 50

typedef struct pilha {

int n;

int vet[MAX];

} tipoPilha;

// Prototipos das funcoes

tipoPilha *cria(void);

void push(tipoPilha *p, int v),

libera(tipoPilha *p);

int pop(tipoPilha *p),

vazia(tipoPilha *p);

58

MC-1424 Algoritmos e Estruturas de Dados I - 2° trimestre de 2009

Pilha em C – Exemplo (1)// Funcao para criar uma pilha de dadostipoPilha *cria(void){tipoPilha *p = (tipoPilha*) malloc(sizeof(tipoPilha));p->n = 0; // Inicializa pilha com zero elementosreturn p;

}

// empilhamento (push) de elementosvoid push(tipoPilha *p, int v){if (p->n == MAX) {printf("Capacidade da pilha estourou.\n");exit(1);}/*Insere elemento na proxima posicao livre*/p->vet[p->n] = v;p->n++;

}

59

60MC-1424 Algoritmos e Estruturas de Dados I - 2° trimestre de 2009

Pilha em C – Exemplo (1)// Funcao para desempilhamento (pop) de elementosint pop(tipoPilha *p){int v;if (vazia(p)) {printf("tipoPilha vazia.\n");return -1;}v = p->vet[p->n-1];p->n--;return v;

}// Funcao que verifica se uma pilha esta vaziaint vazia(tipoPilha *p){return (p->n == 0);

}

Pilha em C – Exemplo (1)

/* Funcao que libera espaco em memoria alocado para a pilha */

void libera(tipoPilha *p){free(p);

}

61

Topo – agora é um ponteiro para o topo da pilha Pilha vazia: Topo= NULL

não possui restrição de tamanho máximo

Pilhas em lista encadeada

62

Pilha em lista encadeada

empilha

desempilhanovo elemento

63

Aplicações de Pilhas

Aplicações diretas Histórico de páginas visitadas em um navegador

Web Desfazer uma seqüência de ações em um editor de

textos (Ctrl+Z) Realizar cálculos usando a notação polonesa (por

exemplo, calculadoras HP) Chamada de procedimentos em Sistemas

Operacionais

Aplicações indiretas Estrutura de dados auxiliar para algoritmo

64

Exemplo de aplicação

Calculadora pós-fixada

Notação para expressões aritméticas – infixa = operador entre os operandos (1-2)*(4+5)

pós-fixa = operador após operandos 1 2 – 4 5 + * pré-fixa = operador antes dos operandos * - 1 2 + 4 5

Exemplo:

calculadora HP científica usa notação pós-fixa

65

Exemplo de aplicação

Calculadora pós-fixada

Avaliação de expressões aritméticas pós-fixadas: cada operando é empilhado numa pilha de valores quando se encontra um operador desempilha-se o número apropriado de operandos realiza-se a operação devida empilha-se o resultado

Exemplo: avaliação da expressão 1 2 – 4 5 + * Tipo de dados abstratos (TDA)

66

Tipos abstratos de dados (TAD)

A idéia é encapsular (esconder) de quem usa um determinado tipo a forma concreta com que ele foi implementado

Para isso, separa-se a declaração e a implementação do TAD em dois arquivos:

- NomeDoTAD.h : com a declaração

- NomeDoTAD.c : com a implementação

O programa ou outros TADs que utilizam o seu TAD devem dar um #include no arquivo .h

67

Tipos abstratos de dados (TAD)

Exemplo:

Vamos implementar a estrutura de um TAD em ContaBancaria, com os campos número e saldo onde os clientes podem fazer as seguintes operações:

• Iniciar uma conta com um número e saldo inicial

• Depositar um valor

• Sacar um valor

• Imprimir o saldo

68

Tipos abstratos de dados (TAD)

ContaBancaria.h

/* definição do tipo */typedef struct { int numero; double saldo;} ContaBancaria;

/* declaração das funções */void Inicializa(ContaBancaria* conta, int numero, double saldo);

void Deposito (ContaBancaria* conta, double valor);

void Saque (ContaBancaria* conta, double valor);

void Imprime (ContaBancaria conta);

69

MC-1424 Algoritmos e Estruturas de Dados I - 2° trimestre de 2009

Tipos abstratos de dados (TAD)ContaBancaria.c

#include <stdio.h>#include "Contabancaria.h"void Inicializa(ContaBancaria* conta, int numero, double saldo){ (*conta).numero = numero; (*conta).saldo = saldo;}void Deposito (ContaBancaria* conta, double valor){ (*conta).saldo += valor;}void Saque (ContaBancaria* conta, double valor){ (*conta).saldo -= valor;}void Imprime (ContaBancaria conta){printf("Numero: %d\n", conta.numero);printf("Saldo: %f\n", conta.saldo);}

70

Tipos abstratos de dados (TAD)

int main (int argc, char **argv){ ContaBancaria conta1; Inicializa(&conta1, 918556, 300.00); printf("\nAntes da movimentacao:\n "); Imprime(conta1); Deposito(&conta1, 50.00); Saque(&conta1, 70.00); printf("\nDepois da movimentacao:\n "); Imprime (conta1);}

71

72

Atividade em aula

Implementar uma TAD para pilha em lista encadeada com as seguintes operações :

1. Criar uma pilha vazia2. Empilhamento3. Desempilhamento4. Imprime a pilha

73

Pilha em C (arquivo pilha.h) – Ex2

typedef struct {int matricula;char nome[20];

} t_pilha;

void empilha(t_pilha aluno);t_pilha desempilha();t_pilha noTopo();int cheia();int vazia();

74

MC-1424 Algoritmos e Estruturas de Dados I - 2° trimestre de 2009

Pilha em C (arquivo pilha.c) –Ex2#include "pilha.h“

#define TAMMAX 3

#define VAZIA -1

int topo = VAZIA;

t_pilha pilha[TAMMAX];

void empilha(t_pilha aluno){

pilha[++topo] = aluno;

}

t_pilha desempilha() {

return pilha[topo--];

}

t_pilha noTopo() { return pilha[topo];}

int cheia() { return topo+1 == TAMMAX;

}

int vazia() { return topo == VAZIA;

}75

Recommended