-
Notifications
You must be signed in to change notification settings - Fork 2
/
stack.c
121 lines (103 loc) · 1.63 KB
/
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
/*
* stack.c
* Analizador Sintactico
*
*
*/
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define INT_DIGITS 600
typedef struct node {
int value;
struct node *next;
} Node;
typedef struct stack {
Node *first;
int size;
} Stack;
void initStack(Stack *s) {
s->first = 0;
s->size = 0;
}
int isEmpty(Stack *s) {
if (s->first == 0) {
return TRUE;
} else {
return FALSE;
}
}
int push(Stack *s, int ele) {
Node *nuevo = (Node *) malloc(sizeof(Node));
if (nuevo == 0) {
return FALSE;
}
nuevo->value = ele;
nuevo->next = 0;
if (isEmpty(s)) {
s->first = nuevo;
} else {
nuevo->next = s->first;
s->first = nuevo;
}
s->size++;
return TRUE;
}
int top(Stack *s) {
if (isEmpty(s)) {
return -1;
} else {
return s->first->value;
}
}
int pop(Stack *s) {
if (isEmpty(s)) {
return -1;
} else {
int aux = s->first->value;
Node *tmp = s->first;
if (s->first->next == 0) {
s->first = 0;
} else {
s->first = tmp->next;
}
free(tmp);
s->size--;
return aux;
}
}
void clear(Stack *s) {
while (pop(s) != -1){}
s->size = 0;
}
void despliega(Stack *s, int *pila) {
int aux;
Node *tmp = s->first;
for (aux = s->size - 1 ; aux >= 0; aux--) {
pila[aux] = tmp->value;
tmp = tmp->next;
}
}
char *itoaC(i)
int i;
{
// Room for INT_DIGITS digits, - and '\0' //
static char buf[INT_DIGITS + 2];
char *p = buf + INT_DIGITS + 1; //points to terminating '\0'
if (i >= 0) {
do {
*--p = '0' + (i % 10);
i /= 10;
} while (i != 0);
return p;
}
else { // i < 0
do {
*--p = '0' - (i % 10);
i /= 10;
} while (i != 0);
*--p = '-';
}
return p;
}