Вычислить значение произвольного выражения, представленного в обратной польской записи - C (СИ) (73634)

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Помогите с прогой пожалуйста. Дано арифметическое выражение длиной до 30 символов, заканчивающееся знаком равенства. Выражение содержит знаки операции +, -, *, / и представлено в обратной польской записи. Если это операнд, то записать его в стек; если это операция, то извлечь два элемента из стека, выполнить математическую операцию и занести результат в стек. Вычислить значение выражения, используя стек операндов. Язык программирования С++. Помогите пожалуйста Пример: 345+2*63/-+ = 19 Прогу сделал, но почему-то выводит не тот результат.
#include <stdio.h>
#include <iostream>
using namespace std;
 
int Chislo ( char text [], int *i )
{
    int c = 0;
    while ( text [*i] >= '0' && text [*i] <= '9999' )
    {
        c = c * 10000 + ( text [*i] - '0' );
        (*i)++;
    }
    return c;
}
 
int main()
{
    char text [80];
    int i;
    float opd [3];
    char opc [3];
    int pr [3];
    int j = -1;
    cout << "Vvedite verazenie: ";
    gets ( text );
    i = -1;
    do
    {
        i++;
        opd [++j] = Chislo ( text, &i );
        opc [j] = text [i];
        switch ( text [i] )
        {
            case '+':
            case '-': pr [j] = 1; break;
            case '*':
            case '/': pr [j] = 2; break;
            case ' ': pr [j] = 0;
        }
        while ( j > 0 && pr [j] <= pr [j-1])
        {
            switch ( opc [j-1])
            {
                case '+': opd [j-1] = opd [j-1] + opd [j]; break;
                case '-': opd [j-1] = opd [j-1] - opd [j]; break;
                case '*': opd [j-1] = opd [j-1] * opd [j]; break;
                case '/': opd [j-1] = opd [j-1] / opd [j];
            }
            opd [j-1] = opc [j];
            pr [j-1] = pr [j];
            j = j-1;
        }
    }
    while ( text [i] != ' ');
    cout << "Rezultat: " << opd [0] << endl;
 
    system ( "pause" );
    return 0;
}
Проверьте, пожалуйста. Но мне надо, чтобы числа были максимум 4-значные и массив строки был динамический. Спасибо, заранее

Решение задачи: «Вычислить значение произвольного выражения, представленного в обратной польской записи»

textual
Листинг программы
#include <cstdio>
 
int main() {
    bool run = true;
    char op[666];
    double stack[666];
    int top = -1;
    while (run) {
        scanf("%s", op);
        double val;
        if (sscanf(op, "%lf", &val) == 1) {
            stack[++top] = val;
        } else {
            val = stack[top--];
            if (op[1] == '\0') {
                switch (op[0]) {
                case '+':
                    stack[top] += val;
                    break;
                case '-':
                    stack[top] -= val;
                    break;
                case '*':
                    stack[top] *= val;
                    break;
                case '/':
                    stack[top] /= val;
                    break;
                case '=':
                    printf("%f\n", val);
                    run = false;
                    break;
                default:
                    printf("error\n");
                    run = false;
                    break;
                }
            } else {
                printf("error\n");
                run = false;
            }
        }
    }
}

Оцени полезность:

11   голосов , оценка 3.909 из 5
Похожие ответы