| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
lucas86
Registrado: 15 Nov 2011 Mensajes: 1
| Publicado: 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
| Publicado: 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 | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |