/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Ayuda convertir Pilas a Colas

 
      Índice del Foro elrincondelc.com -> C/C++ en General
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
lucas86



Registrado: 15 Nov 2011
Mensajes: 1

MensajePublicado: 15/11/2011 5:34 pm
Título: Ayuda convertir Pilas a Colas

me podrian ayudar a cambiarlo a colas o que es lo que le tengo que modificar gracias

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <windows.h>
HANDLE salida=GetStdHandle(STD_OUTPUT_HANDLE);

void gotoxy(SHORT x,SHORT y)
{
COORD pantalla;
pantalla.X=(short) x ;
pantalla.Y=(short) y;
SetConsoleCursorPosition(salida,pantalla);
}

#define TAM 6
#define MAX TAM-1

typedef struct
{
int tope;
int detalle[TAM];
}pila;


int todo(pila *);
int vacio(pila *);
void push(pila *, int);
void pop(pila *,int *);


void main()
{
pila p,t;
int dato,opc,elemento,flag=0;
p.tope=0;
do
{
system("cls");
SetConsoleTextAttribute(salida,14|50);
system("cls");
printf("\nPILAS");
printf("\n1. Apilar");
printf("\n2. Desapilar");
printf("\n3. Ver Pila");
printf("\n4. Salir");
printf("\n\nOpcion: ");
scanf("%d",&opc);
switch(opc)
{
case 1:
if(!todo(&p))
{
printf("\nIngrese el Dato: ");
scanf("%d",&dato);
push(&p,dato);
printf("\nDato Ingresado");
}
else
{
printf("\nPila Llena");
}
break;

case 2:
if(!vacio(&p))
{
pop(&p,&dato);
printf("\nEl Dato Eliminado es %d",dato);
}
else
{
printf("\nPila Vacia");
}
break;

case 3:
if(!vacio(&p))
{
t.tope=0;
do
{
pop(&p,&dato);
printf("\n%d",dato);
push(&t,dato);
}while(!vacio(&p));
do
{
pop(&t,&dato);
push(&p,dato);
}while(!vacio(&t));
}
else
{
printf("\nPila Vacia");
}
break;
case 4:
flag=1;
break;
case 5:
flag=0;
break;

default:
printf("\nEsta Opcion No es Valida");
}
if(!flag)
{
printf("\n\nPresione Una Tecla Para Continuar...");
getch();
}
}while(!flag);

}

int todo(pila *p)
{
return(p->tope==MAX);
}

int vacio(pila *p)
{
return(p->tope==0);
}

void push(pila *p,int dato)
{
if(!todo(p))
{
(p->tope)++;
p->detalle[p->tope]=dato;
}
else
printf("\n");
}

void pop(pila *p,int *dato)
{
if(!vacio(p))
{
*dato=p->detalle[p->tope];
(p->tope)--;
}
else
printf("\n");
}
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 6586
Ubicación: Mexico

MensajePublicado: 16/11/2011 4:15 am
Título:

Ese programa sobre pilas tiene un error que lleva al desperdicio de un elemento: al agregar (push) primero incrementas el indice y después agregas cuando debería ser al revés.

Las operaciones de la pila de forma correcta son:

1) Push
Primero agregas al elemento y solo después incrementas el contador.
2) Pop
Primero decrementas el contador y retornas ese elemento.

De esa forma el contador también indica el numero de elementos en la pila y en lugar de dos macros (TAM y MAX) solo necesitas una (TAM).

----

Para cambiarlo a una cola la forma mas simple pero ineficiente:

1) Se utilizan dos contadores: uno para el primer elemento de la cola y otro para la posición del ultimo elemento (mas uno).

2) En la operación "Push" se agrega el elemento en la posición indicada por "ultimo" y se incrementa ese contador.

3) En la operación "Pop" se retorna el elemento en la posición indicada por "primero" y se incrementa ese contador.

Un detalle adicional es, al agregar y sacar elementos de la cola esta puede "desplazarse a la derecha" y esto requiere que todos los elementos se desplacen a la izquierda. Suena complicado pero es de lo mas sencillo, seria mas o menos así:
Código:
int i;
int j;

/* ... */

if (ultimo == TAM){
   j = 0;
   for (i = primero; i < ultimo; i++){
      cola[j] = cola[i];
      j++;
   }
   
   primero = 0;
   ultimo  = j;
}


Con eso el proceso de la cola se mantiene tan sencillo como sea posible evitando el uso de una cola circular.

Un saludo
_________________
Memory never recaptures reality. Memory reconstructs. All reconstructions change the original, becoming external frames of reference that inevitably fall short.
--
Mentat Handbook
Volver arriba
      Índice del Foro elrincondelc.com -> C/C++ en General
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com