Pilas Y colas en c++

xjuanch0x

Lanero Reconocido
25 Sep 2004
690
Tengo una problemilla y es que no he podido encontrar una buenos manuales de Pilas y colas en c++...los he buscado en google pero le quedo grande , probe en conclase.net y nada asi que necesito alquien que me ayude y que si tienes unos buenos ejemplos me haga el favor de pasarmelos , aclaro los ejemplos debe ser desde lo mas basico hasta lo mas avanzado ya que estudio ingenieria de sistemas y voy a entra a estructura de datos y quiero manejar esto antes de entrar....garcias amigos por cualquier ayudita que me den..... :\
 

Jose Chavez

Lanero Reconocido
28 Abr 2004
142
Eso si que esta dificil yo tambien estoy estudiando Sistemas y eso de las colas es muy complicado explicarlo en este foro pero te recomiendo este libro que me sirvio de mucho sacandome de grandes apuros Como programar en C++ de Deitel,Si se te hace muy caro dime y yo tepongo algunos ejemplillos aqui.
 

Nobunaga

Lanero Reconocido
29 Jun 2004
1,617
Pilas y colas........punteros al piso :-D

consigase los libros de cesar becerra santamaria y queda al pelo
 

PROGRAMADOR

Lanero Regular
27 Dic 2004
85
ESTE ES EL CODIGO FUE DE LOS QUE YO HIZE ESPERO QUE LE SIRVA



#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>


struct colas{
char clave[100],nc[100],nom[100];
double sueldo;
int tiquete;
struct colas *sig;
};
struct colas *read=NULL,*front=NULL;

void menu();
void dentrar();
void boletas();
void pasar();
void calculo();

main()
{


menu();

return 0;
}


void menu()
{
int n,esta,opcc;

for(int i=0;;i++)
{
clrscr();
esta=0;
gotoxy(20,2);
printf("BANCO DAVIVIENDA");
gotoxy(10,7);
printf("1. PASAR AL CLIENTE AL BANCO");
gotoxy(10,9);
printf("2. PASAR AL CAJERO ");
gotoxy(10,11);
printf("3. QUIT");

gotoxy(10,13);
printf("CUAL OPCION: ");
scanf("%d",&n);
switch(n)
{
case 1:dentrar();break;
case 2:pasar();break;
case 3:if(!front)
esta=1;
else
{

gotoxy(20,17);
printf("TODAVIA QUEDAN CLIENTE");
gotoxy(20,17);
printf("1. DESEA CONTINUAR DESPACHANDO QUEDAN CLIENTES");
gotoxy(20,18);
printf("2. CERRAR SOFTWARE");
gotoxy(20,20);
printf("OPCION: ");
scanf("%d",&opcc);
if(opcc==2)
esta=1;
}
break;
}
if(esta)break;
}

}
void dentrar()
{
char s;
int mirar;
struct colas *a,*b;
a=(struct colas*)malloc(sizeof(struct colas));
clrscr();
gotoxy(10,2);
printf("INFORMACION DEL CLIENTE");
gotoxy(10,5);
printf("NOMBRE: ");
gets(a->nom);
gets(a->nom);
gotoxy(10,7);
printf("CLAVE: ");
gets(a->clave);

b=read;
s='S';

do{
mirar=0;
gotoxy(10,9);
printf("NUMERO DE CUENTA: ");
gets(a->nc);
if(read)
{
while(b)
{
if(!(strcmp(b->nc,a->nc)))
{
gotoxy(20,22);
printf("YA EXISTE");
getch();
gotoxy(10,9);
printf(" ");
gotoxy(20,22);
printf(" ");
mirar=1;
break;
}
b=b->sig;
}
}
if(mirar==0)
s='N';
}while(s=='S');


gotoxy(10,11);
printf("SUELDO: ");
scanf("%lf",&a->sueldo);
gotoxy(10,17);
printf("NUMERO DE BOLETA: ");
scanf("%d",&a->tiquete);

if(!read)
{
a->sig=NULL;
read=front=a;
}
else
{
a->sig=read;
read=a;
}
return;
}

void pasar()
{
struct colas *q;
int bol,o;
if(front)
{
for(int i=0;;i++)
{
if(!front)break;
clrscr();
gotoxy(20,2);
printf("CAJERO DE SERVICIO");
gotoxy(10,6);
printf("1. SEGUIR");
gotoxy(10,7);
printf("2. CANCELAR");
gotoxy(10,8);
printf("OPCION: ");
scanf("%d",&o);
if(o==1)
{
gotoxy(10,10);
printf("NUMERO DE BOLETA AL SEGUIR [[ %d ]]",front->tiquete);
gotoxy(10,12);
printf("SU NUMERO DE BOLETA: ");
scanf("%d",&bol);
if(bol==front->tiquete)
calculo();
else
{
q=read;
while(q)
{
if(q->tiquete==bol)
{
gotoxy(20,20);
printf("LO SIENTO POR FAVOR HAGA LA FILA");
gotoxy(20,21);
printf("LA BOLETA QUE SIGUE ES %d",front->tiquete);
getch();
break;
}
q=q->sig;
}
if(!q)
{
gotoxy(20,20);
printf("LO SIENTO NO EXITE EL CLIENTE");
getch();
}
gotoxy(20,20);
printf(" ");

}
}
else
break;
}
}
else
{
gotoxy(10,22);
printf("NO HAY NINGUN CLIENTE");
getch();
gotoxy(10,22);
printf(" ");
}
return;
}

void calculo()
{
struct colas *d;
int opc,apro=0,c;
double re;
char cla[100],con;
clrscr();
gotoxy(20,2);
printf("EJECUTAR PROCESO");
gotoxy(10,6);
printf("SALDO DEL CLIENTE %s ES %.0lf",front->nom,front->sueldo);
gotoxy(10,10);
printf("1. RETIRAR");
gotoxy(10,12);
printf("2. CONSIGNAR");
gotoxy(10,14);
printf("3. NADA");
gotoxy(10,16);
printf("OPCION DESEADA ");
scanf("%d",&opc);
gets(cla);
gotoxy(10,18);
printf("ANTE DE EJECUTAR LA OPERACION POR FAVOR");
c=3;
do{
gotoxy(10,19);
printf("CLAVE: ");
gets(cla);
if(!(strcmp(cla,front->clave)))
apro=1;
else
{
gotoxy(10,21);
printf("%d OPORTUNIDADES",c);
getch();
gotoxy(10,21);
printf(" ");
c--;
gotoxy(10,19);
printf(" ");

}

}while((c>=0)&&(!apro));

if(apro)
{
apro=0;
c=3;
do{
gotoxy(10,20);
printf("NUMERO DE CUENTA: ");
gets(cla);
if(!(strcmp(cla,front->nc)))
apro=1;
else
{
gotoxy(10,21);
printf("%d OPORTUNIDADES",c);
getch();
gotoxy(10,21);
printf(" ");
c--;
gotoxy(10,20);
printf(" ");
}
}while((c>=0)&&(!apro));
}

if(apro)
{
switch(opc)
{
case 1:while(1)
{
clrscr();
gotoxy(5,3);
printf("SALDO DEL CLIENTE %s ES %.0lf",front->nom,front->sueldo);
gotoxy(10,7);
printf("CUANTO DESEA RETIRAR: ");
scanf("%lf",&re);
if(re>front->sueldo)
{
gotoxy(10,20);
printf("NO SE PUEDE POR EL SUELDO QUE ES MENOR");
getch();
gotoxy(10,20);
printf(" ");
gotoxy(10,20);
printf("DESEA CONTINUAR <S><N> ");
con=getche();
if(toupper(con)=='N')break;
}
else
{
front->sueldo=front->sueldo-re;
break;
}
}
gotoxy(1,15);
printf("NUEVO SALDO DEL CLIENTE %s ES %.0lf",front->nom,front->sueldo);
getch();
break;
case 2:while(1)
{
clrscr();
gotoxy(5,3);
printf("SALDO DEL CLIENTE %s ES %.0lf",front->nom,front->sueldo);
gotoxy(10,7);
printf("CUANTO DESEA CONSIGNAR: ");
scanf("%lf",&re);
if(re<0)
{
gotoxy(10,20);
printf("NO EXISTE ESA CANTIDAD");
getch();
gotoxy(10,20);
printf(" ");
gotoxy(10,20);
printf("DESEA CONTINUAR <S><N> ");
con=getche();
if(toupper(con)=='N')break;
}
else
{
front->sueldo=front->sueldo+re;
break;
}
}
gotoxy(1,15);
printf("NUEVO SALDO DEL CLIENTE %s ES %.0lf",front->nom,front->sueldo);
getch();
break;
case 3: clrscr();
gotoxy(10,10);
printf("GRACIAS POR SU ATENCION");
getch();
break;
}
}
else
{
d=read;
while((d->sig!=front)&&(d!=front))
d=d->sig;
if(d==front)
{
gotoxy(5,22);
printf("LO SIENTO ACCESO DENEGADO POR NO CONSUIDIR CON LA INFORMACION");
gotoxy(5,23);
printf("COMO NO HAY MAS CLIENTES NO SE ATIENDE MAS");
getch();
gotoxy(5,22);
printf(" ");
gotoxy(5,23);
printf(" ");
}
else
{
gotoxy(5,22);
printf("LO SIENTO ACCESO DENEGADO POR NO CONSUIDIR CON LA INFORMACION");
gotoxy(5,23);
printf("POR FAVOR EL SIGUIENTE ES CON BOLETA %d",d->tiquete);
getch();
gotoxy(5,22);
printf(" ");
gotoxy(5,23);
printf(" ");
}
}
d=read;
while((d->sig!=front)&&(d!=front))
d=d->sig;
if(d==front)
front=read=NULL;
else
{
front=d;
d=front->sig;
front->sig=NULL;
}
free(d);
return;
}
 

kemark

Lanero Reconocido
9 Abr 2003
2,499
a ver... lo de colas y stacks no es tan dificil, el concepto es sencillo, la cola imaginesela como una cola del banco donde primeor se atiende al primero que llega y asi sucesivamente, las pilas imaginesela como una monton de libros uno sobre el otro y el primero que se va cogiendo es el que esta mas arriba, ahora estas cosas tiene ciertas reglas como los desbordamientos que pueden ocurrir hacia arriba y hacia abajo.. ademas de ciertas operaciones basicas de cada estructura las cuales basicamente son:

de stack:
push: mete un elemento a la pila
pop: saca un elemento de la pila
una que retorne si esta vacia

y para la cola:
encolar: mete un elemento a la cola
decolar: saca un elemento de la cola

esas funciones son bastante sencillas de implementar, por lo que se lo dejo...
ya que lo necesita en c++ implemente una clase para cada estructura, es cosa de 20 minutos...
 

FoxM

Lanero Reconocido
25 Jun 2004
917
De acuerdo con Krawek: Yo lo aprendí utilizando similes con la realidad y haciendo dibujos (tengo mejor memoria visual ;)) Los libros en realidad me confundieron más por una sencilla razón: Como utilizan un lenguaje específico (digamos C), hay que estar pendiente de los detalles del lenguaje, además de los detalles de la estructura en sí. De los detalles del lenguaje el que más confunde sin duda alguna es el de punteros... es mejor tratar ese tema solo y aparte por un rato. Yo me concentraría más en la estrucutra en sí (mucha teoría). Cuando ya tenga más o menos claros ambos conceptos, comprenderá que la mejor forma de aprender punteros es con stacks, queues, lists y binary trees hahahaha.

Apenas pueda haga un programa que implemente stacks y queues dinámicamente (con lists) y estáticamente (con arrays) Verá que después de tanto darle duro al teclado y darse duro con la pantalla, se le iluminará el camino ;) Toma tiempo aprehender el concepto, pero vale la pena.

Por cierto... Yo sé que es off topic... :p No es por nada, pero no mezcle la estructura (capa lógica) con la UI (capa "gráfica"). Es decir, no estudie con libros de César Becerra hahaha o haga cosas como:
Código:
void insertar(){
    while (true){
        cout << "Ingrese número. 999 para terminar" << endl; /* Una aberracion. capa gráfica */
        cin >> dato;
        cab->d =dato;   /* Terrible! Capa lógica */
        /* Ponga aqui el resto de la capa lógica, es decir, el resto de operaciones en la estructura */
    }
}
que se ve HORRIBLE

Más bien haga su código más elegante, modularizado y sobretodo, entendible para quien vaya a hacer mantenimiento de su código (los buenos profesores aprecian mucho esta cualidad):
Código:
void menu_insert(){  // el prefijo "menu" sugiere que hay interaccion con usuario
    cout << "Ingrese número." << endl; // No hay "999 para terminar"
    int dato = 0; // Suponiendo dato int, obviamente puede ser cualquier tipo, incluso objetos
    cin >> dato;
    queue.push(dato); // toda la lógica de la inserción del dato se hace en este método.
}

No solo hace su código más claro, sino que está tan modularizado que si hay errores es más fácil detectarlos sin necesidad de ponerse a recorrer un jurgo de líneas de código de UI para encontrar un error de lógica. Además esto con el tiempo le induce el concepto de reusar su código para otros tipos de dato y no apegarse luego a punteros void y todo ese enredo mamón ;) Para eso estan los templates, pero eso es ooootro cuento aparte ;)
 

xjuanch0x

Lanero Reconocido
25 Sep 2004
690
Gracias por la ayuda compadres me sirvio de mucho...esto de c++ si que es una nota.....y lo raro es que aprendia a manejar las class y un poco de POO y apenas voy a manejar las pilas y colas....gracias a todos compadritos ...
 

kemark

Lanero Reconocido
9 Abr 2003
2,499
ot: hoy me tire toda la tarde buscando un SIGSEGV = ( y el maldito error era de las librerias, argh

y que compilador estas usando?
 

jomunoz

Lanero Reconocido
31 Mar 2004
682
Pues lo mas sencillo para mí es usar el tipo de dato "stack" de la biblioteca standar de plantillas (STL).

Es muy sencillo de usar solo lo declaras y sus metodos los puedes encontrar aquí:
http://www.sgi.com/tech/stl/stack.html

PD:Debes tener un compilador reciente (del 2000 o tal vez 1999, para acá). Y stack es solo para pilas, con colas no sé que deberias usar.



Para más información de la STL: http://www.sgi.com/tech/stl/
 

FoxM

Lanero Reconocido
25 Jun 2004
917
Stacks y Queues estándar de C++

No creo que el profesor le acepte eso..
SI usa un compilador como el GCC o Borland 5 en adelante puede usar las clases stack y queue que vienen en la librería estándar. Más tarde pongo un ejemplo.

Actualización:

Yo creo que el profesor no le guste la idea (yo traté de hacer eso con el mío, pero me tocó repetir todo el programa hahahaha)

Utilizar stacks y queues desde C++ es facilísimo, ni siquiera tiene que bajarse el STL (el de SGI) porque los creadores de C++ ya pusieron eso en la librería estándar del lenguaje.


Los métodos son:
Stack
empty() -> true if the stack is empty
pop() -> removes the top element
push() -> adds an element to the top
size() -> returns the number of elements in the stack
top() -> returns the top element of the stack

Código:
#include <stack>

using namespace std;

int main(){
    stack<int> my_stack;

    my_stack.push(8008);                   // Insertar dato
    if (!(my_stack.empty()))               // verificar si está vacío o no
        my_stack.push(my_stack.size());    // insertar, como dato, el tamaño del stack
    int top = my_stack.top();              // chequear el último valor insertado en el stack
    my_stack.pop();                        // retirar el último valor del stack
}

Para los queue es igual, pero lo métodos varían un poco:

Queue
back() -> returns the last element
empty() -> true if the queue is empty
front() -> returns the first element
pop() -> removes the first element
push() -> adds an element to the end of the queue
size() -> returns the number

Como ve, lo ideal es hacer una clase mas o menos igual... el reto está en implementar eso (y eso es precisamente lo que le ponen a hacer). Lo mejor es que siempre la "interfaz" de la clase va separada de la implementación (de la clase). Fíjese que aquí uno no tiene ni idea de cómo funciona esa clase, simplemente sabe cómo utilizar los métodos y listo. Ese es un buen diseño orientado a objetos. De hecho ESE es el objetivo: a nivel del usuario de la clase no importa nada más... a nivel de creador de la clase, el cuento es diferente ;)

P.S. Por cierto, una buen link para tener de referencia es CPP Reference
P.P.S. Si le sucede lo que me pasó a mí, que no me dejaban utilizar la palabra class entonces reemplazela por struct ;) que es igual que una clase en TODO, excepto en una cosa: struct, por default, deja a lo que contiene como public, mientras que para class todo es private. Si no sabe de lo que estoy hablando entonces es que el profesor de OOP no va al ritmo que debe hahahah... mentiras, no me haga caso :p
 

FoxM

Lanero Reconocido
25 Jun 2004
917
Hahahaha... definitivamente de "clase" no tiene nada :p
Me quedo incluso con el estilo de Deitel, pero nada que hacer con el de Eckel... es el mejor.
 

PROGRAMADOR

Lanero Regular
27 Dic 2004
85
Aqui Le Envio Los Archivos. Son Dos De Pilas Y Uno De Colas
 

Archivos adjuntos

  • Ejemplo1.zip
    1.8 KB · Visitas: 854
  • Ejemplo2.zip
    567 bytes · Visitas: 780

kemark

Lanero Reconocido
9 Abr 2003
2,499
en COLA.cpp te falta hacer delete a dos punteros (al menos a aux)
==411== definitely lost: 8 bytes in 1 blocks.
 

Los últimos mensajes

Los últimos temas