Оценка выражения постфикса в C - PullRequest
0 голосов
/ 19 февраля 2012

Я пытаюсь написать программу, которая оценивает постфиксное арифметическое выражение. Программа отправляет строку символов в мою функцию evaluatePostfix, которая переходит к идентификации операндов и операторов и предлагает целочисленное решение. Я манипулирую стеками в этой программе, нажимая отсканированный символ, как он идентифицирован, и, конечно, выполняя соответствующие попсовые функции, когда нужно оценить. Однако сейчас у меня проблема с зависанием программы в бесконечном цикле. Наверное, я не совсем уверен, как сказать функции перейти к следующему символу в строке после того, как он оценил первый символ. Следует также отметить, что пользователь помещает пробел между каждым операндом и оператором. Вот моя функция:

int evaluatePostfix(char *postfixStr)
{
    stack * s;
    int x, y;

    stackInit(&s);

    do {
        if(isOperand(postfixStr) == 1) {
            stackPush(&s, postfixStr);
        }

        if(isOperator(postfixStr) == 1) {
            y = atoi(stackPop(s));
            x = atoi(stackPop(s));
            char *str = malloc(10 * sizeof(char));
            sprintf(str, "%d", applyOperator(x, y, postfixStr));
            stackPush(&s, str);
        }

    } while (postfixStr != NULL);
    return stackPop(s);
}

Я знаю, что функции, которые управляют стеком, являются правильными, поскольку они были предоставлены моим инструктором. Может быть, кто-нибудь подскажет, что мне не хватает?

1 Ответ

0 голосов
/ 19 февраля 2012

Вы можете изменить условие while на while (++postfixStr != NULL), чтобы увеличить указатель на следующий символ в postfixStr.

Это приращение выполняется с использованием префиксной нотации (++var против var++), чтобы следующий символ сравнивался с NULL. Я не знаком с поведением используемых вами стековых функций, но я бы порекомендовал изменить цикл do { ... } while (++postfixStr != NULL); на цикл while (postfixStr != NULL) { ... } и увеличить postfixStr в конце этого блока while.

Самое безопасное, что нужно сделать, это добавить параметр длины строки в вашу функцию:

int evaluatePostfix(char *postfixStr, int strLength)

Затем вы будете использовать цикл, который явно переходит от начала строки в индексе 0 к индексу strLength - 1, который будет безопасно обрабатывать пустые строки, не заканчивающиеся NULL.

...