Version:0.9 StartHTML:0000000105 EndHTML:0000007943 StartFragment:0000000152 EndFragment:0000007909
/******************************************************/
/*************** Isidro Pastor Jorda ******************/
/*************** Noemi Ruth Moya Hinojo ***************/
/******************************************************/
/****************** Telematica ************************/
/******************** FPII ****************************/
/****************** Practica 3 ************************/
/******************************************************/

#include <iostream.h>
#include <stdlib.h>
#include <cstdlib>              //include para utilizar las funcion rand();
#include "PilaE.h"

typedef int Vector[TALLAMAX];

bool Ordenar (Vector v);

int main()
{
    int i;
    Vector v;

    i = 0;

    while(i <= TALLAMAX -1)   // Generamos el vector aleatorio
    {
        v[i] = (1 + rand()%20 ) - 4;  // Asi generamos tambien numeros negativos dentro del vector
        cout << v[i] << " ";
        i++;
    }

    if (Ordenar (v) ) // Llamamos a la funcion para ordenar el vector dentro del if
    {
        cout << endl << " El vector ordenado es: ";
        for (i = 0; i <= TALLAMAX - 1; i++)   // mostramos por pantalla el vector ordenado
            cout << v[i] << " ";
        cout << endl << endl;
    }
    else    // Si se produjeron errores durante la ordenacion mostramos el error por pantalla
        cerr << endl << " Se Produjeron errores durante la ordenacion" << endl;

    system("PAUSE");
    return 0;
}

/*****************************************************************************
* Funcion: Ordenar
* Descripcion: Ordena un vector pasado como paramtro a la funcion utilizando
*              el metodo de insercion directa usando la clase pila. Creamos
*              dos pilas donde iremos haciendo la ordenacion
*
*
* Parametros:
*
* Nombre        E/S       Descripcion
* ------       -----      -----------
*  v           E/S       Vector a ordenar
*
*
*
* Valor devuelto:
*       bool, cierto si se ha podido ordenar el vector correctamente y falso
*       si se produjeron errores durante la ordenacion.
*****************************************************************************/

bool Ordenar (Vector v)
{
    int i, x, cima;
    bool ok, apilado;
    Pila a, b;

    ok = true;   // Variable para controlar si se producen errores
    i = 0;       // variable indice para recorrer el vector

    while ( i <= TALLAMAX-1 && ok)  // bucle para recorrer todos los valores del vector
    {
        apilado = false;    // inicializamos una variable de control que sera true cuando hayamos apilado el dato
        x = v[i];           // almacenamos el dato que queremos introducir en la pila en x
        do
        {
            if ( a.PilaVacia() )          // si la pila a esta vacia
                apilado = a.Apilar(x);    // Directamente apilamos el dato x en la pila a
            else
            {
                a.CimaPila(cima);         // Obtenemos la cima de la pila a

                if ( x < cima )           // y la comparamos con x
                {
                    b.Apilar(cima);       // Si x es menor que la cima de a, apilamos en b la cima de a
                    a.Desapilar();        // y desapilamos de a
                }
                else
                    apilado = a.Apilar(x);// Si x es mayor que la cima de a apilamos directamente en a
            } // else

         /******************************************************
         * Una vez hayamos apilado el elemento en la pila a    *
         * movemos todos los elementos que tengamos en la pila *
         * b a la pila a                                       *
         *******************************************************/

            while (!(b.PilaVacia()) && ok && apilado)
            {
                b.CimaPila(cima);
                ok = a.Apilar(cima);
                b.Desapilar();
            }
        }
        while (!apilado && ok); // Si no hemos apilado el dato continuamos las comparaciones tras desapilar de a
        i++;   // aumentamos el contador indice del vector para coger el siguiente elemento a insertar
    } // while

    if (ok)  // Si todo ha ido bien copiamos los elementos de la pila a al vector
    {
        for ( i = 0; i <= TALLAMAX - 1; i++)
        {
            a.CimaPila( v[i] );
            a.Desapilar();
        }
    } // con esto ya tendriamos el vector totalmente ordenado de mayor a menor

    return (ok); // Devolvemos ok para saber si se produjeron fallos en la ordenacion
};