Мой предыдущий вопрос можно найти здесь (просто хочу заверить это самое полезное сообщество, что я не пытаюсь спамить вопросы):
Оценка выражения с постфиксом в 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, работает достаточно хорошо, потому что кажется, что он берет исходную строку и напрямую модифицирует ее, когда она помещает меньшие части строки в стек, полностью удаляя ее из исходной строки. Хотя это и не является хорошей практикой (поскольку вместо этого я должен создать копию исходной строки, чтобы сохранить целостность ввода, я чувствую и изменить копию вместо этого), я считаю, что это будет работать в рамках этого проекта. Я просто хотел поделиться своими выводами на случай, если они пригодятся кому-нибудь в будущем. Кроме того, если в моем описании использования есть некоторые вещи, которые необходимо исправить, во что бы то ни стало, я хотел бы знать.