0

Buenas. Tengo una duda con un código de c++, en el cual utilizo pilas y colas, básicamente tengo que construir una pila y un diccionario, ambos de caracteres, para cada carácter perteneciente a la pila verificar si está en el diccionario, y si la respuesta es positiva el carácter debe ser ingresado en una cola (inicialmente vacía), en caso contrario debe ser descartado.

Esto es lo que llevo:

#include <iostream>
#include <stack>
#include <queue>

using namespace std;

int main ()
{
    stack <string> pila; 
    pila.push("Palabra1"); 
    pila.push("Palabra2");  
    pila.push("Palabra3");
    pila.push("Palabra4");
    cout << "Hay en total " << pila.size () << " palabras en el diccionario" << endl;
    cout<<endl;
    cout << "Palabras en el diccionario: ";
    while(!pila.empty()) {
        cout <<endl<< pila.top() << endl;
        pila.pop();
    }    

    string diccionario[] = {"Palabra1", "Palabra2", "Palabra3", "Palabra4"};

    cout<<"Verificando si las palabras de la pila se encuentran en el diccionario"<<endl;
    cout<<"Opciones: Palabra1, Palabra2, Palabra3, Palabra4"<<endl;
    cout<<endl;

    //Aqui deberia hacer la comparacion entre la pila y el diccionario para luego agregar los valores a la cola

    queue <string> cola;     
    //estas serian las sentencias si se encontrara la palbra en el diccionario
    cout<<"La palabra introducida se encuentra en el diccionario"<<endl;
    cout<<"Se procedera a introducirla en la cola"<<endl;

    cola.push("Palabra1"); } else {
    cout<<"La palabra no se encuentra en el diccionario por lo tanto no se agregara a la cola"<<endl;}

    while(!cola.empty()) {
    cout <<endl<< cola.front() << endl;
    cola.pop(); }    

    system("pause");
}

Mi duda vendría siendo como comparar la pila y el "diccionario" que no sé si sería útil crearlo como un array o como otra pila o cola, ya que no me especifican si el diccionario debe ser una pila, cola o array. Muchas gracias por sus respuestas

Grecia P. Valero
  • 123
  • 3
  • 15

1 Answers1

2

Tengo una duda con un código de c++, en el cual utilizo pilas y colas.

En primer lugar, deberías plantearte si estás usando los contenedores adecuados para las tareas que quieres hacer; puedes echar un vistazo a esta pregunta para hacerte una idea.

Una pila se caracteriza por mantener el orden en que se insertan los datos y el orden en que éstos son extraídos, también dependiendo del orden de inserción (pudiendo ser FIFO o LIFO); si a tu aplicación le es indiferente el orden de inserción y extracción seguramente una pila no sea el contenedor que debes escoger.

En cuanto al diccionario, éste es un contenedor asociativo (que asocia clave y valor) que generalmente no permite repeticiones. Tú estás usando un arreglo llamado diccionario pero como el hábito no hace al monje tu arreglo no es un diccionario.


Para cada carácter perteneciente a la pila verificar si está en el diccionario.

Asumo que te refieres para cada elemento de la pila no para cada carácter.

Para buscar los elementos de la pila que estén en el diccionario deberías comparar cada elemento de la pila con cada elemento del diccionario. Por desgracia, una pila no está pensada para ser recorrida de manera secuencial si no para añadir (push) y quitar (pop) elementos en un orden determinado, por eso una pila (stack) no ofrece ninguna función o utilidad para recorrer sus elementos (y por este motivo, para mostrar los elementos que tu pila contiene, en tu código debes borrar los elementos mientras los muestras).

Así que vamos a substituir tu pila (stack) por una lista (list) y tu arreglo por otra lista, ya que para ser un diccionario deberíamos saber la clave (y no has especificado ninguna clave), con estos otros contenedores es posible recorrer los datos contenidos y comprobar si existen en uno u otro contenedor, para ello me ayudo de la función std::count de la cabecera <algorithm>:

int main()
{
    std::list <std::string> pila;
    pila.push_back("Palabra1");
    pila.push_back("Palabra2");
    pila.push_back("Palabra3");
    pila.push_back("Palabra4");
    std::cout << "Hay en total " << pila.size() << " palabras en el diccionario\n\n";

    std::cout << "Palabras en la pila: ";
    for (const auto &palabra: pila) std::cout << '\n' << palabra << '\n';

    std::list <std::string> diccionario = {"Palabra1", "Palabra2", "Palabra3", "Palabra4"};

    for (const auto &palabra: pila)
    {
        std::cout << "La entrada " << palabra << " esta en el diccionario?: "
                  << ((std::count(diccionario.begin(), diccionario.end(), palabra) != 0) ? "Si" : "No") << '\n';
    }

    return 0;
}
PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82