Bienvenido, Invitado
Nombre de Usuario Contraseña: Recordarme

Pilas y Colas
(1 viendo) (1) Invitado
  • Página:
  • 1

TEMA: Pilas y Colas

Pilas y Colas hace 1 año, 8 meses #15487

Buenas amigos, hoy vengo con algo interesante.

Resulta que debo hacer un programa que me permita escribir o registrar las cedulas de algunas personas que van llegando en orden.

Debo registrar las cedulas en el orden que llegan para que se vaya atendiendo a cada persona.

La primera en llegar es la primera en ser atendida.

Cola -> Primera en llegar es la primera en salir.

TENGO UN EJEMPLO DE PILA EN C:

/* TAD Pila- Implementacion #3                                       */
/*-------------------------------------------------------------------*/
#include <stdio.h>
 
/*-------------------------------------------------------------------*/
/* ESTRUCTURAS DE DATOS */
/*-------------------------------------------------------------------*/
 
typedef int TipoP;
 
typedef struct TNodoPila
{ TipoP info;
struct TNodoPila *sig;
} TPila, *Pila;
 
/*-------------------------------------------------------------------*/
/* Inicializadora: Crea una pila vacia */
/* Complejidad : O(1) */
 
Pila inicPila(void)
{ Pila pil=(Pila)malloc(sizeof(TPila));
pil->sig=NULL;
return pil;
}
 
/*-------------------------------------------------------------------*/
/* Modificadora: Agrega un elemento al tope de la pila */
/* Complejidad : O(1) */
 
void adicPila(Pila pil, TipoP elem)
{ Pila p=(Pila)malloc(sizeof(TPila));
p->info=elem;
p->sig=pil->sig;
pil->sig=p;
}
 
/*-------------------------------------------------------------------*/
/* Modificadora: Elimina el elemento del tope de la pila */
/* Complejidad : O(1) */
 
void elimPila(Pila pil)
{ Pila p=pil->sig;
pil->sig=pil->sig->sig;
free(p);
}
 
/*-------------------------------------------------------------------*/
/* Analizadora: Retorna el elemento del tope de la pila */
/* Complejidad : O(1) */
 
TipoP infoPila(Pila pil)
{ return pil->sig->info;
}
 
/*-------------------------------------------------------------------*/
/* Analizadora: Informa si la pila se encuentra vacia */
/* Complejidad : O(1) */
 
int vaciaPila(Pila pil)
{ return pil->sig==NULL;
}
 
/*-------------------------------------------------------------------*/
/* Destructora: Destruye la pila y retorna toda la memoria */
/* Complejidad: O(N) */
 
void destruirPila(Pila pil)
{ Pila p,q;
for(p=pil; p!=NULL; p=p->sig)
{ q=p;
p=p->sig;
free(q);
}
}
 
/*-------------------------------------------------------------------*/
/* Depuracion: Imprime el contenido de una pila */
 
void impPila(Pila pil)
{ Pila p;
for (p=pil->sig; p!=NULL; p=p->sig)
printf("%d ",p->info);
printf("]\n");
}
 
void main(void)
{ int com,elem;
Pila pil;
 
pil=inicPila();
do
{ /* Presenta el menu de opciones */
printf("\n0. Salir\n");
printf("1. Agregar cedula\n");
printf("2. Eliminar cedula\n");
printf("3. Ver Lista ingresada\n");
printf("4. Pila vacia?\n");
printf("\nOpcion: ");
scanf("%d",&com);
 
/* Da control a cada una de las operaciones del TAD Pila */
switch(com)
{ case 1: printf("Elemento: ");
scanf("%d",&elem);
adicPila(pil,elem);
break;
case 2: elimPila(pil);
break;
case 3: printf("Tope= %d\n",infoPila(pil));
break;
case 4: if (vaciaPila(pil))
printf("Pila vacia\n");
else
printf("Pila no vacia\n");
break;
}
 
/* Imprime el contenido de la pila */
impPila(pil);
} while (com!=0);
 
destruirPila(pil);
}
 


Es fantastco y funciona, pero el anterior ejemplo es PILA por lo que el primero que llega es el ultimo en salir.

Ahora he tratado de pasarlo a COLA (Primero en llegar, primero en salir):

OJO: AMIGO TEN PENDIENTE DE LOS EN CADA FUNCION YA QUE TENGO LOS COMENTARIOS DE PILAS PARA PODER GUIARME ABAJO DE CADA FUNCION DE COLA

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define MAX 30
typedef int TipoC;
 
typedef struct
{
TipoC info[MAX];
int primero;
int ultimo;
}TCola, *Cola;
 
 
/* Constructora */
Cola inicCola(void)
{
Cola col=(Cola)malloc(sizeof(TCola));
col->primero=col->ultimo=-1;
return col;
}
 
/* { Pila pil=(Pila)malloc(sizeof(TPila));
pil->sig=NULL;
return pil;
}*/

 
/* Modificadoras */
void adicCola(Cola col, TipoC elem)
{
if (col->primero==-1)
{
col->info[0]=elem;
col->primero=col->ultimo=0;
}
else
{
col->ultimo=(col->ultimo+1)%MAX;
col->info[col->ultimo]=elem;
}
}
/*{ Pila p=(Pila)malloc(sizeof(TPila));
p->info=elem;
p->sig=pil->sig;
pil->sig=p;
}*/

 
void elimCola(Cola col)
{
if(col->primero==col->ultimo)
col->primero=col->ultimo=-1;
else
col->primero=(col->primero+1)%MAX;
}
 
/*
{ Pila p=pil->sig;
pil->sig=pil->sig->sig;
free(p);
}*/

 
/* Analizadoras */
 
TipoC infoCola(Cola col)
{
return col->info[col->primero];
}
/*{ return pil->sig->info;
}*/

 
int vaciaCola(Cola col)
{
return col->primero==-1&&col->ultimo==-1;
}
/*{ return pil->sig==NULL;
}*/

 
/* destructora */
void destruirCola(Cola col)
{
free(col);
}
/*
{ Pila p,q;
for(p=pil; p!=NULL; p=p->sig)
{ q=p;
p=p->sig;
free(q);
}
}
*/

 
 
main ()
{
int com;
inicCola();
printf("Ingrese un valor");
scanf("%d",&com);
adicCola(col, com);
 
 
 
}
 
 


Me he enredado, simplemente la idea es que pida la cedula , la guarde segun orden , y cuando quiera moistrarla, este de primero el que ingreso de primero, y los que vayan ingresando se vayan guardando en la cola.
  • JuanDP
  • DESCONECTADO
  • Visitante
  • Temas: 14
  • Karma: 0

Re: Pilas y Colas hace 1 año, 8 meses #15489

Bueno esto es un ejemplo mas claro y mas definido a lo que quiero hacer, pero aun no me corre, que será?

#include <stdio.h>
#include <stdlib.h>
 
/*-------------------------------------------------------------------*/
/* ESTRUCTURAS DE DATOS */
/*-------------------------------------------------------------------*/
typedef int TipoC;
 
typedef struct TNodoCola
{TipoC info;
struct TNodoCola *sig;
}*pNodoCola;
 
 
typedef struct
 
{ pNodoCola primero, ultimo;
}TCola, *Cola;
/*-------------------------------------------------------------------*/
/* Inicializadora: Crea una cola vacia */
 
Cola inicCola (void)
{ Cola col=(Cola)malloc(sizeof(TCola));
col->primero=col->ultimo=NULL;
return col;
}
/*-------------------------------------------------------------------*/
/* Modificadora: Agrega un elemento al tope de la pila */
 
void adicCola(Cola col, TipoC elem)
{
pNodoCola p=(pNodoCola)malloc(sizeof(struct TNodoCola));
p->info=elem;
p->sig=NULL;
 
if(col->primero==NULL)
col->primero=col->ultimo=p;
else
{ col->ultimo->sig=p;
col->ultimo=p;
}
}
 
/*-------------------------------------------------------------------*/
/* Modificadora: Elimina el elemento del tope de la pila */
void elimCola(Cola col)
{
pNodoCola p;
if(col->primero->sig==NULL)
{free(col->primero);
col->primero=col->ultimo=NULL;
}
 
else
 
{
p=col->primero;
col->primero=p->sig;
free(p);
}
}
 
/*-------------------------------------------------------------------*/
/* Analizadora: Retorna el elemento del tope de la pila */
TipoC infoCola(Cola col)
{return col->primero->info;
}
 
/*-------------------------------------------------------------------*/
/* Analizadora: Informa si la pila se encuentra vacia */
int vaciaCola(Cola col)
{return col->primero==NULL;
}
/*-------------------------------------------------------------------*/
/* Destructora: Destruye la pila y retorna toda la memoria */
void destruirCola(Cola col)
{ pNodoCola p,q;
for(p=col->primero; p!=NULL; p=p->sig, free(q))
q=p;
free(col);
}
 
/*-------------------------------------------------------------------*/
/* Destructora: Destruye la pila y retorna toda la memoria */
void impCola(Cola col)
{ Cola p;
for (p=col->sig; p!=NULL; p=p->sig)
printf("%d ",p->info);
printf("]\n");
}
 
void main(void)
{ int com,elem;
Cola col;
 
col=inicCola();
do
{ /* Presenta el menu de opciones */
printf("\n0. Salir\n");
printf("1. Agregar un elemento\n");
printf("2. Eliminar un elemento\n");
printf("3. Informacion en el tope\n");
printf("4. Pila vacia?\n");
printf("\nOpcion: ");
scanf("%d",&com);
 
/* Da control a cada una de las operaciones del TAD Pila */
switch(com)
{ case 1: printf("Ingresar cedula: ");
scanf("%d",&elem);
adicCola(col,elem);
break;
case 2: elimCola(col);
break;
case 3: printf("Siguiente persona= %d\n",infoCola(col));
break;
case 4: if (vaciaCola(col))
printf("Pila vacia\n");
else
printf("Pila no vacia\n");
break;
}
 
/* Imprime el contenido de la pila */
impCola(col);
} while (com!=0);
 
destruirCola(col);
}
 
 
  • JuanDP
  • DESCONECTADO
  • Visitante
  • Temas: 14
  • Karma: 0
Última Edición: hace 1 año, 8 meses Por JuanDP.

Re: Pilas y Colas hace 1 año, 8 meses #15490

Tienes algunos fallos de estructura en el de las pilas. Esto es difícil de explicar, pero a ver si viendo el de las colas entiendes cómo funciona:

#include <stdio.h>
#include <stdlib.h>
 
/*-------------------------------------------------------------------*/
/* ESTRUCTURAS DE DATOS */
/*-------------------------------------------------------------------*/
typedef int TipoC;
 
typedef struct SCola {
TipoC info;
struct SCola *ant; //anterior
} TNodo;
typedef TNodo* TCola;
 
 
/*-------------------------------------------------------------------*/
/* Inicializadora: Crea una cola vacia */
 
void inicCola (TCola *cola) {
*cola = NULL;
}
/*-------------------------------------------------------------------*/
/* Analizadora: Informa si la pila se encuentra vacia */
int vaciaCola(TCola cola){
return cola==NULL;
}
/*-------------------------------------------------------------------*/
/* Modificadora: Agrega un elemento al tope de la pila */
 
void adicCola(TCola *cola, const TipoC e) {
TNodo *nodo = (TNodo*)malloc(sizeof(TNodo));
nodo->info = e;
nodo->ant = NULL;
TCola p;
if (vaciaCola(*cola))
*cola = nodo;
else {
p = *cola;
while (p->ant != NULL)
p = p->ant;
p->ant = nodo;
}
}
 
/*-------------------------------------------------------------------*/
/* Modificadora: Elimina el elemento primero */
void elimCola(TCola *cola) {
if (!vaciaCola(*cola)) {
TNodo *nodo;
nodo = *cola;
*cola = nodo->ant;
free(nodo);
}
}
 
/*-------------------------------------------------------------------*/
/* Analizadora: Retorna el elemento primero de la cola */
TipoC infoCola(TCola cola){
return cola->info;
}
 
/*-------------------------------------------------------------------*/
/* Destructora: Destruye la pila y retorna toda la memoria */
void destruirCola(TCola *cola){
while (!vaciaCola(*cola))
elimCola(cola);
}
 
/*-------------------------------------------------------------------*/
/* Imprime la cola */
void impCola(TCola cola){
while (!vaciaCola(cola)) {
printf("%d\n",cola->info);
cola = cola->ant;
}
}
 
int main()
{ TipoC elem;
int com;
TCola cola;
 
inicCola(&cola);
do
{ /* Presenta el menu de opciones */
printf("\n0. Salir\n");
printf("1. Agregar un elemento\n");
printf("2. Eliminar un elemento\n");
printf("3. Informacion en el tope\n");
printf("4. Pila vacia?\n");
printf("\nOpcion: ");
scanf("%d",&com);
 
/* Da control a cada una de las operaciones del TAD Pila */
switch(com)
{ case 1: printf("Ingresar cedula: ");
scanf("%d",&elem);
adicCola(&cola,elem);
break;
case 2: elimCola(&cola);
break;
case 3: printf("Siguiente persona= %d\n",infoCola(cola));
break;
case 4: if (vaciaCola(cola))
printf("Pila vacia\n");
else
printf("Pila no vacia\n");
break;
}
 
/* Imprime el contenido de la pila */
impCola(cola);
} while (com!=0);
 
destruirCola(&cola);
return 0;
}
  • JoniJnm
  • DESCONECTADO
  • Administrador
  • Temas: 4167
  • Karma: 144
Los siguientes usuarios han agradecido: JuanDP

Re: Pilas y Colas hace 1 año, 8 meses #15491

Men muchisimas gracias, esta perfecto, GRACIASSSSSSSS
  • JuanDP
  • DESCONECTADO
  • Visitante
  • Temas: 14
  • Karma: 0

Re: Pilas y Colas hace 1 año, 8 meses #15653

hacer una pila en python es de lo más sencillo:

 
Lista = []
Lista.append(item)
#Ponemos el item en la pila(lista)
Lista.pop()
#quitamos el primer item de la pila la particularidad que tiene, es que te devuelve el ítem quitado.


En C es algo más difícil.
  • xyz0k
  • DESCONECTADO
  • Experto
  • Temas: 206
  • Karma: 10
Última Edición: hace 1 año, 8 meses Por xyz0k.

Re: Pilas y Colas hace 1 año, 8 meses #15654

Joder, sí que es fácil xD

Y el tipo de item puede ser cualquiera?
  • JoniJnm
  • DESCONECTADO
  • Administrador
  • Temas: 4167
  • Karma: 144

Re: Pilas y Colas hace 1 año, 8 meses #15658

Pues si, un entero, real, lista, tupla...

Incluso puedes al crear una clase, anular las otras opciones de la lista, como añadir por el principio si se trata de una cola, etc.

He editado el código, porque el Push no está definido. Es append (El push lo definíamos nosotros en clase).

  • xyz0k
  • DESCONECTADO
  • Experto
  • Temas: 206
  • Karma: 10
Última Edición: hace 1 año, 8 meses Por xyz0k.
  • Página:
  • 1
Página generada en: 0.44 segundos