Advertisement
davidcastrosalinas

20201201 ABB+Heap+Stack | Buscar las 150 palabras más repetidas en el libro "quijote de la mancha"

Dec 1st, 2020
289
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.94 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. using namespace std;
  4.  
  5. /******************************************************************/
  6. #include <queue>
  7. template <class T> class Heap {
  8. public:
  9.     Heap() {};
  10.     virtual ~Heap() {};
  11.  
  12.     void agregar(T dato, int prioridad) {
  13.         ParPrioridadDato par;
  14.         par.first = prioridad;
  15.         par.second= dato;
  16.         h2.push(par);
  17.     };
  18.  
  19.     T extraer(){
  20.         ParPrioridadDato par = h2.top();
  21.         h2.pop();
  22.         return par.second;
  23.     }
  24.  
  25.     bool vacia() {
  26.         return h2.empty();
  27.     }
  28.  
  29. private:
  30.     typedef std::pair<int, T> ParPrioridadDato; // Prioridad, orden
  31.  
  32.     class ComparePrioridad {
  33.         public:
  34.             bool operator() (ParPrioridadDato a, ParPrioridadDato b) {
  35.                 return a.first > b.first;
  36.             }
  37.     };
  38.     std::priority_queue<ParPrioridadDato, std::vector<ParPrioridadDato>, ComparePrioridad> h2;
  39. };
  40.  
  41. #include <stack>
  42. template <class Tipo>
  43. class Stack : private stack<Tipo> {
  44. public:
  45.     void push(Tipo _valor) {
  46.         stack<Tipo>::push(_valor);
  47.     }
  48.  
  49.     Tipo pop() {
  50.         Tipo temp = stack<Tipo>::top();
  51.         stack<Tipo>::pop();
  52.         return temp;
  53.     }
  54.  
  55.     bool empty () {
  56.         return stack<Tipo>::empty();
  57.     }
  58. };
  59. /******************************************************************/
  60.  
  61. struct Nodo {
  62.     string key;
  63.     int value;
  64.     struct Nodo* izq;
  65.     struct Nodo* der;
  66. };
  67. typedef Nodo* AB;
  68.  
  69. /*aunque podríamos utilizar la estructura Nodo,
  70. ocuparemos la estructura ParDatos para que sea más ilustrativa
  71. */
  72. struct ParDatos{
  73.     string key;
  74.     int value;
  75. };
  76.  
  77. void insertar(AB &t, string key){
  78.     if(t == NULL){
  79.         t = new Nodo();
  80.         t->key = key;
  81.         t->value = 1; //es la primera vez que aparece la palabra
  82.         t->izq = NULL;
  83.         t->der = NULL;
  84.     } else {
  85.         if(key == t->key)
  86.             t->value = t->value +1; //procesamos
  87.         else {
  88.             if(key < t->key)
  89.                 insertar(t->izq, key);
  90.             else
  91.                 insertar(t->der, key);
  92.         }
  93.     }
  94. }
  95.  
  96. //mostrar un árbol
  97. void mostrarABB(AB raiz){
  98.     if(raiz == NULL)
  99.         return;
  100.     cout <<raiz->key<<" ("<<raiz->value<<") ";
  101.     mostrarABB(raiz->izq);
  102.     mostrarABB(raiz->der);
  103. }
  104.  
  105. void AbbToHeap(AB t, Heap<ParDatos> &h){
  106.     if(t == NULL)
  107.         return;
  108.  
  109.     ParDatos p;
  110.     p.key   = t->key; //la palabra
  111.     p.value = t->value; //cantidad de veces que aparece la palabra
  112.     h.agregar(p, p.value);
  113.  
  114.     AbbToHeap(t->izq, h);
  115.     AbbToHeap(t->der, h);
  116. }
  117.  
  118. void mostrarHeap(Heap<ParDatos> h){
  119.     while(!h.vacia()){
  120.         ParDatos p = h.extraer();
  121.         cout <<p.key<<" ("<<p.value<<") ";
  122.     }
  123. }
  124.  
  125. void heapToStack(Heap<ParDatos> h, Stack<ParDatos> &s){
  126.     while(!h.vacia()){
  127.         ParDatos p = h.extraer();
  128.         s.push(p);
  129.     }
  130. }
  131.  
  132. void mostrarStackN(Stack<ParDatos> s, int contador){
  133.     int c = contador+1;
  134.     while(!s.empty()){
  135.         ParDatos p = s.pop();
  136.         cout <<c-contador<<" "<<p.key<<" ("<<p.value<<")"<<endl;
  137.         contador--;
  138.         if(contador <= 0)
  139.             return;
  140.     }
  141. }
  142.  
  143. void leerArchivo(string nombreArchivo, AB &raiz){
  144.     ifstream archivo;
  145.     archivo.open(nombreArchivo.c_str(), ios::in);
  146.     string palabra;
  147.     if(archivo.is_open()){
  148.         while(getline(archivo, palabra, ' '))
  149.             insertar(raiz, palabra);
  150.     } else
  151.         cout <<"error en archivo"<<endl;
  152. }
  153.  
  154. int main() {
  155.     /**Objetivo: leer un archivo y obtener las 150 palabras que más se repiten**/
  156.     setlocale(LC_CTYPE,"Spanish");
  157.     AB raiz = NULL;
  158.  
  159.     Heap<ParDatos> h;
  160.  
  161.     Stack<ParDatos> s;
  162.  
  163.     //Para descargar el quijote https://gist.github.com/jsdario/6d6c69398cb0c73111e49f1218960f79
  164.     leerArchivo("C:\\DATA\\el_quijote.txt", raiz);
  165.  
  166.     //mostrarABB(raiz);
  167.     AbbToHeap(raiz, h);
  168.  
  169.     //mostrarHeap(h);
  170.     heapToStack(h, s);
  171.  
  172.     mostrarStackN(s, 150);
  173.  
  174.     return 0;
  175. }
  176.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement