Оценка выражения PostFix в C (новый выпуск) - PullRequest
0 голосов
/ 20 февраля 2012

Мой предыдущий вопрос можно найти здесь (просто хочу заверить это самое полезное сообщество, что я не пытаюсь спамить вопросы):

Оценка выражения с постфиксом в C

Моя проблема связана с оценкой выражений postfix. Скажем, у меня есть постфиксное выражение, например:

3 2 1 2 + ^ ^

Я пытаюсь сохранить значения (все данные, введенные пользователем в виде строки символов) в стеке, и с помощью других функций я намерен оценить его, и конечный результат будет единственным оставшимся элементом в стеке, чтобы выскочить и представить. После нескольких часов работы с отладчиком в Code Blocks я обнаружил, что функция ничего не хранит в стеке. Кроме того, когда я использую свои функции, чтобы проверить, является ли символ, на который указывает символ, операндом, несмотря на то, что он один, он игнорирует соответствующие действия, которые он должен предпринять. Вот код, который я использую с включенной функцией isOperand:

bool isOperand(char *str)
{
    /** For value 3, str seems to be the entire character string
    being "3 2 1 2 + ^ ^" **/
    return isdigit(str) != 0;
}

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

    stackInit(&s);

    while(postfixStr != NULL) {
        /** For the first value 3, it SHOULD be an operand and
        proceed to push it on the stack. But it just skips
        this condition. **/
        if(isOperand(postfixStr)) {
            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);
        }
        ++postfixStr;
    }

    z = stackPop(s);
    stackDestroy(&s);
    return z;
}

Я не знаю, как отправить это только одно значение в указателе, по-видимому. И в случае, если это были двойные или даже тройные цифры, как я мог сказать программе распознавать это? Еще раз, спасибо за ваше время, я, безусловно, ценю всю помощь, которую люди оказывают.

**** РЕДАКТИРОВАТЬ / НАЙТИ РЕШЕНИЕ ****

Что ж, поскольку мне не разрешено отвечать на мой собственный вопрос, хотя я являюсь "новым пользователем", я вместо этого отредактирую исходное сообщение, так что, возможно, оно пригодится кому-то еще в будущем.

Казалось бы, токенизация - подходящая ситуация здесь. Используя

strtok ( строка , разделитель )

функция разбивает строку на более мелкие строки, разделенные между пустыми символами между пробелами. Я все еще не уверен на 100%, если это потому, что я использовал разделитель пробела (иначе ""), но независимо.

Завершение цикла с помощью

token = strtok (NULL, "");

вместо того, чтобы увеличивать указатель на 1, работает достаточно хорошо, потому что кажется, что он берет исходную строку и напрямую модифицирует ее, когда она помещает меньшие части строки в стек, полностью удаляя ее из исходной строки. Хотя это и не является хорошей практикой (поскольку вместо этого я должен создать копию исходной строки, чтобы сохранить целостность ввода, я чувствую и изменить копию вместо этого), я считаю, что это будет работать в рамках этого проекта. Я просто хотел поделиться своими выводами на случай, если они пригодятся кому-нибудь в будущем. Кроме того, если в моем описании использования есть некоторые вещи, которые необходимо исправить, во что бы то ни стало, я хотел бы знать.

1 Ответ

1 голос
/ 20 февраля 2012

Вы звоните isdigit по указателю,

return isdigit(str) != 0;

Это должно быть вызвано в pointee,

return isdigit(*str) != 0; // or, equivalently: return isdigit(*str);
...