Skip to content

Instantly share code, notes, and snippets.

@kalimalrazif
Last active October 25, 2023 21:50
Show Gist options
  • Select an option

  • Save kalimalrazif/6f420a59d33bb5daad136e2dad4a3a4c to your computer and use it in GitHub Desktop.

Select an option

Save kalimalrazif/6f420a59d33bb5daad136e2dad4a3a4c to your computer and use it in GitHub Desktop.
Implementacion de pila dinamica
/*
* Libreria de manejo de entrada y salida.
*/
#include <stdio.h>
/*
* Esta libreria nos permite solicitar pedazos de memoria al sistema operativo, que nos devolvera un la
* direcion de memoria en donde empieza el bloque.
*/
#include <malloc.h>
/*
* Estructura que representa un nodo o elemento en la pila.
*/
struct elemento {
int dato;
struct elemento *next;
};
/*
* Estructura para representar la pila.
*/
struct pila {
struct elemento *frente;
int tamano;
};
int crear(struct pila *);
int apilar(struct pila *, struct elemento);
int desapilar(struct pila *, struct elemento *);
int estaVacia(struct pila);
int main()
{
struct pila mi_pila;
struct elemento e1;
struct elemento e2;
struct elemento e3;
crear(&mi_pila);
e1.dato = 200;
e2.dato = 100;
e3.dato = 1;
apilar(&mi_pila, e1);
apilar(&mi_pila, e2);
apilar(&mi_pila, e3);
e1.dato = 10000;
e2.dato = -45;
e3.dato = 'A';
struct elemento elemento_sacado;
desapilar (&mi_pila, &elemento_sacado);
return (0);
}
/*
* Inicializamos la estructura de la pila, ponemos el valor de frente en NULL y el contador de objetos en 0
*/
int crear(struct pila *p) {
p->frente = NULL;
p->tamano = 0;
return 1;
}
int apilar(struct pila *p, struct elemento elemento){
/* Creamos un elemento nuevecito para meterlo en la pila
* y que el usuario no pudeda luego hacerle nada!
* Copiamos los datos del usuario en nuestro nuevo elemento.
*/
struct elemento *nuevo = (struct elemento *) malloc(sizeof(struct elemento));
// Si por cualquier situacion el OS no puede asignarnos mas memoria la variable queda en NULL, si este
// es el caso nosotros regresaremos un -1 indicando que la operacion fallo.
if (nuevo == NULL) { return -1; }
nuevo->dato = elemento.dato;
nuevo->next = NULL;
/* Ahora metemos ese nuevo elemento en la pila,
* ahora cualquier cambio que haga el usuario no nos afectara
* en nada
*/
nuevo->next = p->frente;
p->frente = nuevo;
p->tamano++;
return 1;
}
int desapilar(struct pila *p, struct elemento *elemento){
// si la pila esta vacia retornamos -1
if (estaVacia(*p) ) { return -1; }
// COPIAMOS el dato a retornar al usuario.
elemento->dato = p->frente->dato;
p->frente = p->frente->next;
p->tamano--;
}
int estaVacia(struct pila p){
if (p.tamano == 0) { return 1; }
//if (p.frente == NULL) { return 1; }
return 0;
}
int tamano(struct pila p){
return p.tamano;
}
@ErickMonterroso
Copy link
Copy Markdown

Como podria usarlo pero leyendo un archivo de texto?

@kalimalrazif
Copy link
Copy Markdown
Author

Todo depende de lo que quieras guardar en la pila.... un caracter, una palabra, una linea?

Dependiendo de eso modificas la estructura elemento

@kalimalrazif
Copy link
Copy Markdown
Author

kalimalrazif commented Jun 4, 2020 via email

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment