-
Notifications
You must be signed in to change notification settings - Fork 1
/
pilha.c
125 lines (106 loc) · 2.24 KB
/
pilha.c
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
#include "stdio.h"
#include "stdlib.h"
#include <string.h>
#include "pilha_privado.h"
Pilha *criaPilha(int capacidade, int tamanho) {
printf ("Alocando pilha...\n");
Pilha *res = malloc(sizeof(Pilha));
if (!res) {
printf("Erro ao criar pilha!\n");
exit(1);
}
res->capacidade = capacidade;
res->tamanhoDados = tamanho;
res->posicao = 0;
printf ("Alocando dados\n");
if (!(res->dados = malloc(capacidade * tamanho))) {
printf("Erro ao criar pilha!\n");
exit(1);
};
return res;
}
int destroiPilha(Pilha *s) {
if (!s) {
printf("Pilha não alocada!!\n");
return 1;
} else {
free(s->dados);
free(s);
return 0;
}
}
int empilha(Pilha *s, void *src) {
if (!s) {
printf("Pilha não alocada!!\n");
return 1;
}
// Calcula a posição
if(cheia(s)==0){
printf("Impossivel inserir mais elementos, pilha cheia!!\n");
return 1;
} else {
int pos = s->posicao * s->tamanhoDados;
// Copia a memória...
memcpy(s->dados + pos, src, s->tamanhoDados);
// Aumenta o tamanho...
s->posicao++;
return 0;
}
}
int desempilha(Pilha *s, void *dst) {
if (!s) {
printf("Pilha não alocada!!\n");
return 1;
}
if(vazia(s)==0){
printf("Não há mais elementos para remover!\n");
return 1;
} else {
// Diminui o contador...
s->posicao--;
// Calcula...
int pos = s->posicao * s->tamanhoDados;
// Copia...
memcpy(dst, s->dados + pos, s->tamanhoDados);
return 0;
}
}
int cheia(Pilha *s) {
if(s->posicao==s->capacidade) return 0;
else return 1;
}
int vazia(Pilha *s) {
if(s->posicao==0) return 0;
else return 1;
}
int limpa(Pilha *s) {
if (!s) {
printf("Pilha não alocada!!\n");
return 1;
}
if(s->posicao==0){
printf("A pilha já está vazia!\n");
return 2;
} else {
printf("Limpando pilha... \n");
s->posicao = 0;
return 0;
}
}
int topo(Pilha *s, void *el) {
if (!s) {
printf("Pilha não alocada!!\n");
return 1;
}
if(vazia(s)==0){
printf("Não há elementos na pilha!\n");
return 1;
} else {
// Calcula...
int valor = s->posicao - 1;
int pos = valor * s->tamanhoDados;
// Copia...
memcpy(el, s->dados + pos, s->tamanhoDados);
return 0;
}
}