-
Notifications
You must be signed in to change notification settings - Fork 0
/
gs_stack.c
145 lines (102 loc) · 2.25 KB
/
gs_stack.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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
/*
* GUILHERME DE NEZ SILVANO MAR/13/2019
*
* BIBLIOTECA PARA IMPLEMENTAÇÃO DE STACKS (PILHAS)
* PARA MANIPULAÇÃO DE VALORES INTEIROS.
*
* PARA USO EM SISTEMAS UNIX.
*/
#include <stdio.h>
#include <stdlib.h>
/*
* DISPONÍVEL EM https://github.com/freebsd/freebsd/blob/master/sys/sys/queue.h
*/
#include <sys/queue.h>
/*
* DEFINE SAÍDA DE DIAGNÓSTICO (DEBUG).
*/
#define VERBOSE 0
/*
*ESTRUTURA DOS NÓS DA PILHA.
*"int num" É NECESSÁRIO PARA O FUNCIONAMENTO DE pop(stack_t).
*/
struct node {
int num;
SLIST_ENTRY(node) next;
} *np;
/*
*DEFINE O TIPO DE VARIÁVEL stack_t.
*/
typedef SLIST_HEAD (head, node) stack_t;
/*
* INSERE UM VALOR INTEIRO NO TOPO DA PILHA.
*/
void push(int n, stack_t * head){
struct node *np;
np = malloc(sizeof(struct node));
np->num = n;
if (VERBOSE == 1)
printf("\nPUSH \t%c\t%d\tONTO ADDR\t%p", n, n, np);
SLIST_INSERT_HEAD(head, np, next);
}
/*
* REMOVE E RETORNA O VALOR INTEIRO DO TOPO DA PILHA.
*/
int pop (stack_t * head){
struct node *np;
np = malloc(sizeof(struct node));
np = SLIST_FIRST(head);
int n = np->num;
if (np == NULL){
printf("\npop: PILHA VAZIA");
return -1;
} else {
if (VERBOSE == 1)
printf("\nPOP\t%c\t%d\tFROM ADDR\t%p", np->num, np->num, np);
SLIST_REMOVE_HEAD(head, next);
}
return n;
}
/*
* IMPRIME OS VALORES CONTIDOS NA PILHA E SUAS POSIÇÕES
* SENDO QUE 0 -> TOPO.
*/
void print_stack (stack_t * head){
struct node *np;
np = malloc(sizeof(struct node));
if (SLIST_EMPTY(head)){
printf("\nprint_stack: PILHA VAZIA");
} else {
int cont = 0;
SLIST_FOREACH(np, head, next){
printf("\nPOS %d\t%c\t%d\tON ADDR\t\t%p", cont, np->num, np->num, np);
cont++;
}
}
}
/*
* INICIA PILHA COM UM NÓ NULO.
*/
void init_stack (stack_t * head){
//caso não esteja iniciada, inicia pilha
if (!SLIST_EMPTY(head)) SLIST_INIT(head);
}
/*
* RETORNA UM TIPO int COM O NUMERO DE ELEMENTOS DA PILHA.
* RETORNA -1 CASO A PILHA ESTEJA VAZIA.
*/
int stack_size(stack_t * head){
if (!SLIST_EMPTY(head)){
int tam = 0;
struct node *np;
np = malloc(sizeof(struct node));
SLIST_FOREACH(np, head, next){
tam++;
}
return tam;
} else {
if (VERBOSE == 1)
printf("\nstack_size: PILHA VAZIA");
return -1;
}
}