-
Notifications
You must be signed in to change notification settings - Fork 0
/
pilha.h
150 lines (111 loc) · 3.34 KB
/
pilha.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
// PILHA - FILO: First In Last Out
// O item primeiro que entrar é o ultimo a sair
typedef struct no_pilha {
INFO info;
struct no_pilha *prox;
} NO_PILHA;
typedef struct pilha {
int tam;
NO_PILHA *topo;
} PILHA;
// Assinaturas
void PILHA_inicia(PILHA *);
bool PILHA_vazia(PILHA *);
void PILHA_empilhar(PILHA *, INFO);
INFO PILHA_get_topo(PILHA *);
INFO PILHA_desempilhar(PILHA *);
void PILHA_imprime(PILHA *);
void PILHA_drop(PILHA *);
// Aloca dados de inicialização da Pilha sem nó cabeça!
void PILHA_inicia(PILHA *p)
{
p->tam = 0;
p->topo = NULL;
}
// Sempre valida o TAM e o ponteiro TOPO para definir se
// a pilha esta vazia
bool PILHA_vazia(PILHA *p)
{
if(p->tam == 0 && p->topo == NULL) {
printf("\nPilha vazia...\n");
return true;
}
return false;
}
void PILHA_empilhar(PILHA *p, INFO x)
{
NO_PILHA *novo = (NO_PILHA *) malloc(sizeof(NO_PILHA));
// Valida se o espaço em memoria foi alocado
if(novo == NULL) {
printf("\nMemória Insulficiente! - [empilhar()]\n");
return;
}
// Atribui a informação dentro do NOVO NÓ.
novo->info = x;
// O ponteiro *prox do NOVO NÓ, aponta para o que o TOPO da PILHA aponta.
novo->prox = p->topo;
// O TOPO da pilha, agora deve apontar para o NOVO NÓ (novo item do topo)
p->topo = novo;
// Importante, atualizar o tamanho da PILHA
p->tam++;
}
// Exibe e retorna a informação do TOPO da PILHA
INFO PILHA_get_topo(PILHA *p)
{
if(PILHA_vazia(p)) return INFO_default_value();
printf("\nConsulta Topo >>> ID[%d] Nome[%s]\n",
p->topo->info.ID, p->topo->info.nome);
return p->topo->info;
}
// Função para desempilhar o NO que esta no TOPO da PILHA
// Return: Retorna a informação (INFO) do NO removido
INFO PILHA_desempilhar(PILHA *p)
{
INFO x = INFO_default_value();
if(!PILHA_vazia(p))
{
// Copia informação para retorno
x = p->topo->info;
// Cria um ponteiro Auxiliar que aponta para o que o TOPO da PILHA aponta
NO_PILHA *aux = p->topo;
// O TOPO da PILHA agora, deve apontar para NO abaixo do NO que esta no TOPO
p->topo = p->topo->prox;
// O ponteiro *aux é a referencia para o NO que será removido.
// Assim, deve desconectar o NO que *aux aponta, direcionando
// o ponteiro *prox para NULL
aux->prox = NULL;
// Libera a referencia de memoria dos dados que *aux aponta
free(aux);
// Importante!, deve atualizar o tamanho da PILHA
p->tam--;
}
// Se o processo de desempilhar ocorreu corretamente
// os dados do NO seram retornados, caso contrário
// retorna os valores default do reset_info
return x;
}
// Imprime do TOPO para o primeiro NO inserido
void PILHA_imprime(PILHA *p)
{
if(PILHA_vazia(p)) return;
NO_PILHA *aux = p->topo;
printf("\nImprimindo Pilha...\n\nTOPO -> ");
while(aux != NULL) {
printf("ID: %d, Nome: %s\n\t", aux->info.ID, aux->info.nome);
aux = aux->prox;
}
printf("TAM = %d\n", p->tam);
}
void PILHA_drop(PILHA *p)
{
if(PILHA_vazia(p)) return;
NO_PILHA *aux;
printf("\nDROP Pilha...\n");
do {
aux = p->topo;
p->topo = p->topo->prox;
aux->prox = NULL;
free(aux);
} while(p->topo != NULL);
p->tam = 0;
}