Advertisement
Loesome

Untitled

Apr 25th, 2014
428
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.89 KB | None | 0 0
  1. #ifndef STACKADT_H
  2. #define STACKADT_H
  3. #include "HeapADT.h"
  4. #include <string>
  5.  
  6. using namespace std;
  7.  
  8. template <typename E> class Heap /*: public HeapADT<E>*/
  9. {
  10. private:
  11.     E* heap;
  12.     int maxSize;
  13.     int n;
  14.  
  15.     void swap(E A[], int i, int j) {
  16.         E aux = A[i];
  17.         A[i] = A[j];
  18.         A[j] = aux;
  19.     }
  20.     void heapfy(int pos){
  21.         int leftTemp, rightTemp, heapTemp;
  22.         leftTemp = left(pos);
  23.         rightTemp = right(pos);
  24.  
  25.         if((heap[pos] < heap[leftTemp]) || (heap[pos]< heap[rightTemp]))        {
  26.  
  27.             if(heap[leftTemp] > heap[rightTemp])            {
  28.                 swap(heap, pos, leftTemp);
  29.                 heapTemp = leftTemp;
  30.             }
  31.  
  32.             else            {
  33.                 swap(heap,pos,rightTemp);
  34.                 heapTemp = rightTemp;
  35.             }
  36.             heapfy(heapTemp);
  37.         }
  38.     }
  39.     bool prior(int a, int b)
  40.     {
  41.         return (a>b);
  42.     }
  43. public:
  44.     Heap(E* h, int num, int max)     {
  45.         heap = h;
  46.         n = num;
  47.         maxSize = max;
  48.         buildMaxHeap();
  49.     }
  50.     int size() const{
  51.         return n;
  52.     }
  53.     bool isLeaf(int pos) const     {
  54.         return (pos >= n/2) && (pos < n);
  55.     }
  56.     int left(int pos) const  {
  57.         return 2*pos + 1;
  58.     }
  59.     int right(int pos) const  {
  60.         return 2*pos + 2;
  61.     }
  62.     int parent(int pos) const  {
  63.         return (pos-1)/2;
  64.     }
  65.     void buildMaxHeap()  {
  66.         for (int i=n/2-1; i>=0; i--) {
  67.             heapfy(i);
  68.         }
  69.     }
  70.     void insert(const E& it) {
  71.         if (n < maxSize) {
  72.             int curr = n++;
  73.             heap[curr] = it;
  74.  
  75.             while ((curr!=0) &&
  76.                    (prior(heap[curr], heap[parent(curr)]))) {
  77.                 swap(heap, curr, parent(curr));
  78.                 curr = parent(curr);
  79.             }
  80.         }
  81.         else{
  82.             string strAux = "Heap is full!";
  83.             return strAux;
  84.         }
  85.     }
  86.     E removefirst() {
  87.         if(n > 0){
  88.             swap(heap, 0, --n);
  89.             if (n != 0){
  90.                 heapfy(0);
  91.             }
  92.             return heap[n];
  93.         }
  94.         else{
  95.             string strAux = "Heap is empty";
  96.             return strAux;
  97.         }
  98.     }
  99.     E remove(int pos) {
  100.         if((pos >= 0) && (pos < n)){
  101.             if (pos == (n-1)){
  102.                 n--; }
  103.  
  104.             else
  105.             {
  106.                 swap(heap, pos, --n);
  107.                 while ((pos != 0) &&
  108.                        (prior(heap[pos], heap[parent(pos)]))) {
  109.                     swap(heap, pos, parent(pos));
  110.                     pos = parent(pos);
  111.                 }
  112.                 if (n != 0) {
  113.                     heapfy(pos);
  114.                 }
  115.             }
  116.             return heap[n];
  117.         }
  118.         else{
  119.             string strAux = "Bad position";
  120.             return strAux;
  121.         }
  122.     }
  123. };
  124.  
  125.  
  126. #endif // STACKADT_H
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement