Advertisement
davidcastrosalinas

20201104 Clase Heap(string) implementada con vectores

Nov 4th, 2020
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.33 KB | None | 0 0
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. class Heap {
  5. public:
  6.     /** Default constructor */
  7.     Heap();
  8.     /** Default destructor */
  9.     virtual ~Heap();
  10.     void agregar(string, int);  //agrega elemento , prioridad
  11.     string extraer();  //solo retorna el elemento
  12.     bool vacio();
  13. protected:
  14. private:
  15.     class DatoPrivado {
  16.     public:
  17.         string nombre;
  18.         int prioridad;
  19.         int dato;
  20.     };
  21.     static const int MAX = 100;
  22.     DatoPrivado Vector[MAX];
  23.     int Ultimo;
  24.     void Subir();
  25.     void Bajar();
  26. };
  27.  
  28. /**IMPLEMENTACION**/
  29. Heap::Heap()  {
  30.     Ultimo = 0;
  31. }
  32.  
  33. Heap::~Heap() {
  34. }
  35.  
  36. bool Heap::vacio() {
  37.     return (Ultimo == 0);
  38. }
  39.  
  40. void Heap::Subir() {
  41.     /**En el método flotar(SUBIR) el nodo dado se compara con su nodo
  42.     padre y se realiza el intercambio si éste es mayor que el padre,
  43.     iterando este paso mientras sea necesario*/
  44.     int k, i;
  45.     DatoPrivado aux;
  46.     aux = Vector[Ultimo];
  47.     Vector[0] = Vector[Ultimo];
  48.     i = Ultimo; /**Última Posicion**/
  49.     k = i/2; /**posición del padre**/
  50.     /**Recorre el arreglo hasta que organiza las prioridades**/
  51.     /**Mientras el padre sea mayor que el hijo**/
  52.     while (Vector[k].prioridad > aux.prioridad) {
  53.         //Al hijo le asigno la posición del padre
  54.         Vector[i] = Vector[k];
  55.         i = k; //Posición del Padre Anterior
  56.         k = i/2; //Posición del nuevo padre
  57.     }
  58.     //nueva Posición del padre
  59.     Vector[i] = aux;
  60. }
  61.  
  62. void Heap::Bajar() {
  63.     bool fin;
  64.     DatoPrivado aux;
  65.     aux = Vector[1];
  66.     int k = 1;
  67.     int i = k*2;
  68.     fin = false;
  69.  
  70.     while ((k <= Ultimo/2)&&(!fin)) {
  71.         if(i < Ultimo) {
  72.             if(Vector[i+1].prioridad < Vector[i].prioridad)
  73.                 i++;
  74.         }
  75.  
  76.         if(aux.prioridad > Vector[i].prioridad) {
  77.             Vector[k] = Vector[i];
  78.             k = i;
  79.             i = k*2;
  80.         }
  81.         else
  82.             fin = true;
  83.     }
  84.     Vector[k] = aux;
  85. }
  86.  
  87. void Heap::agregar(string intDato, int intPrioridad) {
  88.     /**¿Cómo añadir un nuevo elemento?
  89.     1 Colocar el nuevo elemento como último elemento del montículo(Heap), justo a la derecha del último o como primero de un nuevo nivel.
  90.     2 Reestablecer el orden de montıculo flotando(Subiendo) el elemento recién añadido
  91.     En el método flotar(SUBIR) el nodo dado se compara con su nodo padre y se realiza el intercambio si éste es mayor que el padre,
  92.     iterando este paso mientras sea necesario
  93.     */
  94.     DatoPrivado aux;
  95.     aux.prioridad   = intPrioridad;
  96.     aux.nombre        = intDato;
  97.     Ultimo++;
  98.     Vector[Ultimo] = aux;
  99.     Subir();
  100. }
  101.  
  102. string Heap::extraer() {
  103.     string x = Vector[1].nombre;
  104.     Vector[1] = Vector[Ultimo];
  105.     Ultimo--;
  106.     Bajar();
  107.     return x;
  108. }
  109.  
  110. void imprimir(int A[], int n){
  111.     int i;
  112.     cout << "arreglo..." << endl;
  113.     for(i=0; i<n; i++)
  114.         cout << "Arreglo[" << i << "] = " << A[i] << endl;
  115. }
  116.  
  117. int main() {
  118.  
  119.     cout << "[Heap]" << endl;
  120.     Heap h;
  121.     h.agregar("Hector " ,10);
  122.     h.agregar("Maria " ,1);
  123.     h.agregar("Pedro" ,5);
  124.     h.agregar("Don Juan " ,3);
  125.     h.agregar("Rogelio " ,10);
  126.     h.agregar("Roberto " ,10);
  127.     h.agregar("Marco " ,10);
  128.     h.agregar("Rosa" ,1);
  129.     h.agregar("Viviana " ,2);
  130.  
  131.     while(!h.vacio()){
  132.         cout << h.extraer() << endl;
  133.     }
  134.  
  135.     return 0;
  136.  
  137. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement