Evaluación de una expresión postfija

Iniciado por sinhue, 1 Octubre 2016, 05:09 AM

0 Miembros y 1 Visitante están viendo este tema.

sinhue

Buen día todos vengo aquí por que tengo hacer un programa que evalué una expresión postfija, pero no se por que truena al entrar a unos de los ciclos de evaluación he estado utilizando varios métodos para lograrlo y en todos no ha funcionado, anexo el código y toda la ayuda que me puedan brindar la agradezco mucho ;D :
A una condición para este programa es que se debe de seguir estrictamente el algoritmo de una expresión infija-postfija, pero la función de creación funciona satisfactoriamente el problema ocurre en la evaluación, todo lo comentado es código de prueba o métodos que probé y tampoco funcionaron


double evaluapost (vector<string> p) {
    stack<double> pila;
    char e;
    string s;
    int j = 0,k = 0,l = 0;
    unsigned int i = 0,m;
    double op1, op2, n, r;
    string::iterator aux;
    //int d;

    /*for (m= 0; m < p.size(); m++) {
        cout << p.at(m);
    }*/

    //cout << endl;

    while (i < p.size()) {
        s = p.at(i);
        e = s.at(j);

        if (e >= '0' && e <= '9') {
            /*aux = s.begin();

            cout << *aux << endl;
            cout << e << endl;
            cin >> d;*/

            /*while (aux < s.end() && e != '.') {
                k++;
                e = s.at(k);
                ++aux;
            }*/

            cout << e << endl;

            for (m = 0; (m < s.size()) && (l == 0); m++) {
                if (e != '.') {
                    k++;
                    e = s.at(k);
                }

                else {
                    l = 1;
                    k++;
                }

                /*cout << l << endl;
                cout << k << endl;
                cout << m << endl;
                cout << s.size() << endl; aqui entra pero truena */
            }

            l = 0;

            e = s.at(j);

            cout << k << endl;

            //aux = s.begin();

            /*cout << *aux << endl;
            cout << k << endl;
            cin >> d;*/

            /*while (aux <= s.end()) {
                if (e != '.' && l == 0) {
                    n += (e - '0')*pow(10, k-j-1);
                }

                else if (e == '.') {
                    l = 1;
                }

                else {
                    n += (e - '0')*pow(10, k-j);
                }

                j++;
                e = s.at(j);
                ++aux;
            }*/

            for  (aux = s.begin(); aux != s.end(); ++aux) {
                if (e != '.' && l == 0) {
                    n += (e - '0')*pow(10, k-j-1);
                }

                else if (e == '.') {
                    l = 1;
                }

                else {
                    n += (e - '0')*pow(10, k-j);
                }

                j++;
                e = s.at(j);
            }

            cout << n << endl;

            pila.push(n);
        }

        else if (e >= 'A' && e <= 'D') {
            cout << "Introduzca valor de la variable: ";
            cin >> n;

            pila.push(n);
        }

        else if (e == '+' || e == '-' || e == '*' || e == '/') {
            op2 = pila.top();
            pila.pop();
            op1 = pila.top();
            pila.pop();

            switch (e) {

            case '+':
                r = op1 + op2;

                break;

            case '-':
                r = op1 - op2;

                break;

            case '*':
                r = op1*op2;

                break;

            case '/':
                if (op2 != 0) {
                    r = op1/op2;
                }

                else {
                    cout << "¡Error!" << endl;
                    cout << "Una de las operaciones es invalida" << endl;
                    r = 0;
                }

                break;
            }
        }

        i++;
        j = 0;
        k = 0;
        l = 0;
    }

    return r;
}