¿Cómo Crear una Pila (Push/Pop) y Cola (Enqueue/Dequeue) en C? - How to Create a Stack (Push/Pop) and Queue (Enqueue/Dequeue) in C?

 



#include <stdlib.h>

#include <stdio.h>

//Nodo Pila

typedef struct Nodo{  

    int numero;

   struct Nodo *siguiente;  

}miPila;  


//Nodo Cola

typedef struct Nodo1{  

    char nombre;

   struct Nodo1 *siguiente;   

}miCola;  


//Punteros de la Cola

miCola *frente = NULL;

miCola *final = NULL;


//*********************************** PILA ************************************

void pushPila(miPila **pila, int numero){  //Procedimiento para Apilar


    //Creamos un nuevoNodo

    miPila *nuevoNodo; 

    nuevoNodo = (miPila *) malloc(sizeof(miPila)); 

    nuevoNodo -> numero = numero;

    nuevoNodo -> siguiente = *pila;  

    *pila = nuevoNodo;  

}



int popPila(miPila **pila, int numero){  //Procedimiento para Desapilar

    miPila *aux = *pila;  //Auxiliar que apunta al apuntador pila que en este caso va a ir para abajo

    numero = aux->numero; 

    *pila = aux->siguiente;  

  //printf("Numero Eliminado %d:", aux->numero);

   free(aux);  //Eliminamos el nodo que esta arriba de la pila

   return numero;

}


void mostrarPila(miPila **pila){  //Procedimiento para Mostar una Pila

    miPila *aux = *pila;

    printf("\n Su Pila es: ");

    while(aux != NULL){   //Repetir esto hasta que se llegue a NULL, es decir, hasta que ya no exista mas elementos a recorrer.

        printf(" %d ",aux->numero);  //Imprimimos el valor de cada nodo de la Pila

        aux = aux->siguiente; //Pasamos al siguiente nodo, recorremos la pila

    }

    printf(" \n ");

    return;

}


//*********************************** COLA ************************************

void enqueueCola(char nombre){  //Procedimiento para Encolar, agregar elementos a una Cola

    

    miCola *nuevoNodo; //Creamos un nuevoNodo

    nuevoNodo = (miCola *) malloc(sizeof(miCola)); //Reserveamos memoria en el Heap para ese nuevoNodo

    nuevoNodo -> nombre = nombre; //Asiganmos el valor al nuevoNodo

    nuevoNodo -> siguiente = NULL;

    

    if(frente == NULL){  //Si la cola esta vacia, frente aun no apunta a nada

        frente = nuevoNodo;  //Frente apunta a nuevoNodo

    }else{

        final -> siguiente = nuevoNodo; //Si la cola esta con elementos, apunta final, recorre final la cola

    }


    final = nuevoNodo;  //Final apunta a nuevo Nodo

}



char dequeueCola(char nombre){  //Procedimiento para desencolar, eliminar los nodos de una cola

    

   

    miCola *aux = frente;

    nombre = frente -> nombre;  //Permite en nombre almacenar el dato que esta en la cola

    

    if( frente == final){  

        frente = NULL;

        final = NULL;

        

    }else{

        frente = (frente) -> siguiente;  //Si tenemos mas de un dato, el puntero frente apunta al segundo elemento de la cola, para que no se pierda la referencia. 

    }

      

    free(aux); //El primero en ingresar se elimina, ene este caso lo que apunta cada vez frente

    return nombre;

}



void mostrarCola(){   //Procedimiento para Mostar una Cola

    miCola *aux = frente;

    printf("\n Su Cola es: ");

    while(aux != NULL){   //Repetir esto hasta que se llegue a NULL, es decir, hasta que ya no exista mas elementos a recorrer.

        printf(" %c ",aux->nombre);  //Imprimimos el valor del nodo

        aux = aux->siguiente; //Pasamos al siguiente nodo, recorremos la cola

    }

    printf(" \n ");

    return;

}




int main(int argc, const char * argv[]) {

    

    miPila *pila = NULL; //Inicializamos Pila es igual a Null


    int numero,i;

    char nombre;

    int n;


    printf(" ¿Cuántos Numeros/Nombres Desea Ingresar?:  ");

    scanf("%d",&n);   //Total de Numeros

        

    //MENU


    int opcion;

    do{

    printf( "\n 1.  Push Pila");

    printf( "\n 2.  Pop Pila");

    printf( "\n 3.  Mostar Pila");

    printf( "\n 4.  Enqueue Cola ");

    printf( "\n 5.  Dequeue Cola ");

    printf( "\n 6.  Mostar Cola");

    

    printf( "\n Introduzca una Opción (1-6): ");

    scanf("%d", &opcion);

    

    switch (opcion)

    {

        case 1:

           

            for( i = 0; i < n ; i++){

           // printf(" Ingrese el Numero %d: ", i + 1);

            //scanf("%d",&numero);   //Datos a Ingresar

            numero = rand () % 30;

            pushPila(&pila, numero);  //Apilacion de  Numeros Aleatorios

                }

            break;

            

        case 2:

            

            numero = popPila(&pila,numero);

            printf("%d  ",numero);

            break;

    

        case 3:

           

            mostrarPila(&pila);

            break;

            

        case 4:

            

            for( i = 0; i < n ; i++){

            printf(" Ingrese el Nombre Cliente %d: ", i + 1);

            scanf("%s",&nombre);   //Datos a Ingresar

                enqueueCola(nombre);

                }

            break;

            

        case 5:

            

               nombre = dequeueCola(nombre);

               printf("%c  ",nombre);

            break;

            

        case 6:

           

            mostrarCola();

            break;

            

            

    }

        

    }while( opcion != 7);

    return 0;

}


Publicar un comentario

0 Comentarios