sábado, 13 de noviembre de 2010

C - Pilas y Colas

Lenguajes de Programación - Semana 12 - PUNTOS EXTRA

Esta vez tambien traigo unos programitas que concluí en estos dias, se tratan se unas aplicaciones que simulan las estructuras de datos: pilas y colas.

PILA

Esta aplicación permite mediante un menú ejecutar diferentes tareas a la pila, claro que para ello primero hay que rellenarla con algunos datos, podemos imprimir los elementos, sacar elementos, meter elementos. Además es posible realizar operaciones con los 2 elementos de hasta arriba de la pila.
Se realiza con arreglos y realmente no es nada complicado de entender:
#include 
#define FALSE -1
#define TRUE 1

void cabecera(void) {
  int i;
  printf("|");
  for(i = 0; i < 50; i++) printf("-");
  printf("|\n|");  
  printf("\t\tEJEMPLO DE PILA\t\t\t   |\n");
  printf("|");
  for(i = 0; i < 50; i++) printf("-");
  printf("|\n");
  return;
} 

int empty(int top) {
  if(top > -1)
    return FALSE;
  return TRUE;
}

int menu(void) {
  int op; 
  printf("\n\t1. Push data\n");
  printf("\t2. Pop data\n");
  printf("\t3. Stacktop\n");
  printf("\t4. Empty\n");
  printf("\t5. Print\n");
  printf("\t6. Operador\n");
  printf("\t7. Exit\n\n");
  printf("    Selecciona una opcion ->  ");
  scanf("%d", &op); 
  return (op); 
} 

int main(void) {
  int opcion = 0, temp, i, temp2[2];
  int pila [15], tope = -1;
  char operador;
  cabecera();
  while (opcion < 7) {  
    switch(opcion = menu()) {            
    case 1: {
      printf("\n\tIntroduce un dato ->  ");
      scanf("%d", &temp);
      tope++;
      pila[tope] = temp;
      break; 
    } 
      
    case 2: {
      printf("\n");
      if(empty(tope) == FALSE) {
         printf("\t\tElemento retirado -> [%d]\n\n", pila[tope]);
         tope = tope -1; 
      } else 
         printf("\t\tPILA VACIA\n\n");
      break;
    }
      
    case 3: {
      printf("\n");
      for(i = tope; i == tope; i++)
          printf("\tElemento en el tope -> [%d]\n\n", pila[i]); 
      break;
    }
      
    case 4: {
      if(empty(tope) == TRUE)
         printf("\n\tLA PILA ESTA VACIA\n\n"); 
      else
         printf("\n\tLA PILA NO ESTA VACIA\n\n");
      break;
    }
      
    case 5: {
      printf("\n\tELEMENTOS EN PILA\n\n");
      for(i = tope; i >= 0; i--)
         printf("\t\t[%d]\n",pila[i]);
      printf("\n");
      break;     
    }
      
    case 6: {
      while (getchar() != '\n') continue;
      printf("Que operacion quieres realizar?\n\n");
      printf("\tSUMA -> +\n\tRESTA -> -\n\tMULTIPLICACION -> *\n\tDIVISION -> /\n");
      scanf("%c", &operador);
      
      switch(operador) {
      case '*': { 
          if(empty(tope) == FALSE) { 
             temp2[0]=pila[tope];
             tope = tope -1;
             if(empty(tope) == FALSE) {
                temp2[1]=pila[tope];
                tope = tope; 
                pila[tope] = temp2[0] * temp2[1];
                break;
             }
          }
      }
 
      case '/': {
         if(empty(tope) == FALSE) {
            temp2[0]=pila[tope];
            tope = tope -1;
            if(empty(tope) == FALSE) {
               temp2[1]=pila[tope];
               tope = tope; 
               pila[tope] = temp2[0] / temp2[1];
               break;
            }
         }
      }
 
      case '+': {
         if(empty(tope) == FALSE) {
            temp2[0]=pila[tope];
            tope = tope -1;
            if(empty(tope) == FALSE) {
               temp2[1]=pila[tope];
               tope = tope; 
               pila[tope] = temp2[0] + temp2[1];
               break;
            }
         }
      }
 
      case '-': {
         if(empty(tope) == FALSE) {
            temp2[0]=pila[tope];
            tope = tope -1;
            if(empty(tope) == FALSE) {
               temp2[1]=pila[tope];
               tope = tope; 
               pila[tope] = temp2[0] - temp2[1];
               break;
            }
         }
      }
      } 
    }         
    }
  }    
  return 0;  
}


DESCARGA: pila.c

Para compilar: gcc -o pila pila.c
Para ejecutar: ./pila


EJECUCIÓN



COLA DE DATOS

En escencia se trata casi del mismo código anterior pero no es igual, ya que ahora se emula lo que sería una cola de datos, de igual forma se incluye un menú con las operaciones que se pueden realizar en una cola de datos, en este ejemplo no podemos realizar operaciones aritmeticas.
#include 
#define FALSE -1
#define TRUE 1

void cabecera(void) {
  int i; 
  printf("|");
  for(i = 0; i < 50; i++) printf("-");
  printf("|\n|");  
  printf("\t\tEJEMPLO DE COLA DE DATOS\t   |\n");
  printf("|");
  for(i = 0; i < 50; i++) printf("-");  
  printf("|\n"); 
  return;
} 

int empty(int frente, int fondo) {
  if(frente > fondo)
    return FALSE;   
  return TRUE;
}

int menu(void) {
  int op; 
  printf("\n\t1. Insertar elemento\n");
  printf("\t2. Retirar elemento\n");
  printf("\t3. Elemento de incio\n");
  printf("\t4. Verificar cola de datos\n");
  printf("\t5. Imprimir cola de datos\n");
  printf("\t6. Operador\n");
  printf("\t7. Salir\n\n");
  printf("    Selecciona una opcion ->  ");
  scanf("%d", &op); 
  return (op);
} 

int main(void) {    
  int opcion = 0, temp, i, temp2[2];
  int cola [15], frente = 0, fondo = -1;
  char operador;
  cabecera();
  while(opcion < 6) { 
    switch(opcion = menu()) {   
    case 1: {
      printf("\n\tDame el dato a ingresar ->  ");
      scanf("%d", &temp);
      fondo++;
      cola[fondo] = temp;
      break;
    } 
      
    case 2: {
      printf("\n");
      if(empty(frente, fondo) == FALSE) {
        printf("\t\tElemento retirado -> [%d]\n\n", cola[frente]);
        frente = frente +1;                
      } else
          printf("\t\tCOLA DE DATOS VACIA\n\n");
      break;
    }
 
    case 3: {
      if(empty(frente, fondo) == FALSE)
         printf("Elemento al frente es %d\n", cola[frente]); 
      else
         printf("LA COLA DE DATOS ESTA VACIA\n");
      break;
    }
                
    case 4: {
      if(empty(frente, fondo)==TRUE)
          printf("\n\tLA COLA DE DATOS ESTA VACIA\n\n");
      else
          printf("\n\tLA COLA DE DATOS NO ESTA VACIA\n\n");
      break;
    }
      
    case 5: {
      printf("\n\tELEMENTOS EN COLA\n\n");
      printf("INICIO");
      for(i=frente;i<=fondo;i++)
            printf(" <- [%d]",cola[i]);
      printf(" <- FIN\n\n");
      break;            
    }           
    }
  }    
  return 0;
}

DESCARGA: cola.c

Para compliar: gcc -o cola cola.c
Para ejecutar: ./cola


EJECUCIÓN



Espero y les sirvan para comprender estos dos conceptos con los que batallamos tanto el semestre pasado

SALUDOS!!! ^_^

3 comentarios:

  1. Aquí también me corrige que son para la clase. Van a ser cinco en la clase, esos puntos son más preciosos :)

    ResponderEliminar
  2. Gracias por tu aporte, me sirvio de mucho, Felicidades por tu buen blog colega!! :-D

    ResponderEliminar