Skip to content

Instantly share code, notes, and snippets.

@jeanbenitez
Created March 16, 2017 03:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jeanbenitez/db37bd46a5f97cd439e7098ca3aa1b5b to your computer and use it in GitHub Desktop.
Save jeanbenitez/db37bd46a5f97cd439e7098ca3aa1b5b to your computer and use it in GitHub Desktop.
EJERCICIO: Dada una pila con elementos repetidos realizar un algoritmo que busque un elemento en la pila y elimine todos los elementos repetidos dentro de la pila.
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
typedef struct pila{
int dato;
struct pila * sig;
} Pila;
void apilar(Pila ** tope, int d){
Pila * p = (Pila *)malloc(sizeof(Pila));
p->dato = d;
p->sig = *tope;
(*tope) = p;
}
void desapilar(Pila ** tope, int * d){
(*d) = (*tope)->dato;
Pila * p;
p = *tope;
*tope = (*tope)->sig;
free(p);
}
int main(){
/*
EJERCICIO: Dada una pila con elementos repetidos realizar un algoritmo que busque un elemento en la pila y elimine
todos los elementos repetidos dentro de la pila.
Solución en Pseudo:
proc elim_repetidos(tope, elem)
primero = 0
mientras_que tope <> NULL hacer
desapilar(tope, d)
si d <> elem entonces
apilar(tope2, d)
sino
si d == elem && primero == 0 entonces
apilar(tope2, d)
primero = 1
fin_si
fin_si
fin_mientras_que
mientras_que tope2 <> NULL hacer
desapilar(tope2, d)
apilar(tope, d)
fin_mientras_que
fin
VAMOS A HACERLO EN C:
*/
int elem = 3; // Definimos un 'elem' dado
Pila *tope=NULL, *tope2=NULL; // Definimos nuestras pilas
/* Creamos una pila */
apilar(&tope, 3);
apilar(&tope, 5);
apilar(&tope, 3);
apilar(&tope, 6);
apilar(&tope, 3);
apilar(&tope, 8);
/*
La pila 'tope' que pusimos de prueba queda asi:
tope -> [8]
[3]
[6]
[3]
[5]
[3]
El resultado (con elem=3) debe ser:
tope -> [8]
[3]
[6]
[5]
*/
int d, primero = 0;
while(tope!=NULL){
desapilar(&tope, &d);
if(d != elem){
apilar(&tope2, d);
}else if(d == elem && primero == 0){
apilar(&tope2, d);
primero = 1;
}
}
while(tope2!=NULL){
desapilar(&tope2, &d);
apilar(&tope, d);
}
/*
Hagamos un paso adicional para imprimir la pila:
Tenemos que desapilar para leer e imprimir, pero tambien debemos apilar cada dato
en una pila 'auxiliar' (tope2) para luego regresarlos a la pila original
*/
while(tope!=NULL){
desapilar(&tope, &d);
printf("[%d]\n", d);
apilar(&tope2, d);
}
while(tope2!=NULL){
desapilar(&tope2, &d);
apilar(&tope, d);
}
getch();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment