-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathStack.cpp
More file actions
100 lines (79 loc) · 1.64 KB
/
Stack.cpp
File metadata and controls
100 lines (79 loc) · 1.64 KB
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
#include "Stack.h"
struct StackHeader{
int tam;
StackNode* first;
};
struct StackNode{
int valor;
StackNode* next;
};
/*
void destroy(Stack& s){
while(s != null)
s = s->next;
};
-- otra imple mas copada
void destroy(Stack& s){
while(s != null)
pop(s);
};
void pop(Stack& s){
Stack x= s;
s=s->next;
delete x;
};
imple menos copada
int pop(Stack& s){
Stack tmp = s;
int n = s->top;
s=s->next;
delete tmp;
return n;
};
*/
//para que esta imple sea de orden 1 puedo
int size(Stack s){ // este debe ser O(1)
if(s != NULL){
return (s->tam);
} //debo agregar el tamaño en la estructura, listo!
else {
return 0;} // en el caso de que la pila sea vacia
}
//-----------------------------------
//nueva version para mejorar la performance porque sino antes
//cada nodo guardaba el tamaño del stack y uso mucha memoria
//tengo un encabezado previo que guarda el tamaño y un puntero al primer nodo
//quita el primero
void pop(Stack& s){
StackNode* t = s->first;
s->first = s-> first->next;
delete t;
};
// size queda igual que antes
Stack emptyS(){
Stack s = new StackHeader;
s->tam = 0;
s->first = NULL;
return s;
};
// tambien cambia el destroy un toque
void destroy(Stack& s){
//esto elimina los nodos
while(!isEmptyS(s))
pop(s);
//esto elimina el header
delete s;
}
bool isEmptyS(Stack s){
return(s->tam==0);
};
int top(Stack s){
return (s->first->valor);
};
void push(int x, Stack& s){
StackNode* n = new StackNode;
n->valor = x;
n->next = s->first;
s->first = n;
s->tam++;
};