Инфиксные выражения

Я пытаюсь вычислить инфиксное выражение, используя два стека, однако моя программа продолжает получать ошибку сегментации, и я не уверен, что является причиной ошибки. Я попытался следовать псевдокоду для алгоритма RPN, однако я думаю, что моя проблема возникает, когда я вызываю doOperation. Я не уверен, какие параметры включить при вызове этого. Я знаю, что мне нужно (ValueType, char, ValueType), однако я не хочу писать doOperation (ch, ch, ch), так как я почти уверен, что это не поможет. Может кто-нибудь помочь мне выяснить способ вызова этой функции? (Я почти уверен, что это одна из причин, вызывающих ошибку сегментации).

0

Решение

opStack а также valStack в doOperation следует использовать переменную в processExpression,

Его прототип функции должен быть таким:

ValueType doOperation(ValueType operandL, char operation, ValueType operandR, stack<char>& opStack, stack<ValueType>& valueStack)

Обратите внимание на два последних параметра: stack<char>& opStack, stack<ValueType>& valueStack, Они должны передаваться по указателю или по ссылке, а не по значению.

processExpression вызов doOperation как это: doOperation(operandL, ch, operandR, opStack, valueStack) ,

Кроме того, текущая ошибка сегментации происходит потому, что opStack а также valueStack определяется в doOperation не имеет предметов top() будет ссылаться на значение noexist.

0

Другие решения

Попробуйте удалить эти строки из doOperation:

stack<char> opStack;
stack<ValueType> valStack;

operandR = valStack.top();
valStack.pop();

operandL = valStack.top();
valStack.pop();

operation = opStack.top();
opStack.pop();

Обратите внимание, что ваша декларация double result не там — вы должны сохранить это.

Итак, что происходит в приведенных выше строках:

  • Вы создаете стеки opStack а также valStack, Оба из них пусты.

  • Ты звонишь .top(), который делает плохие вещи, когда стек пуст. .pop() делает плохие вещи и на пустых стеках.

  • Вы пытаетесь присвоить значения параметрам, которые вы передали. Даже если это будет успешно, ваши параметры будут бесполезны. В итоге вы просто создаете / инициализируете их в своей функции.

Теперь, после удаления вышеуказанных строк, вам нужно изменить ваши звонки на doOperation, В processExpression вы хотите сделать эти звонки до призвание doOperation:

operandL = valStack.top();
valStack.pop();

operandR = valStack.top();
valStack.pop();

operation = opStack.top();
opStack.pop();

doOperation(operandL, operation, operandR)

Что не очень красиво, особенно когда вы делаете это три раза doOperation, но это начало. Первая цель — получить рабочий код. Вы можете сделать это красиво, если вы так склонны позже.

Кроме того, и это немного педантично, но вы должны переименовать operation переменная быть operator, поскольку это то, что есть на самом деле. «Операция» — это то, что происходит, когда вы выполняете оператор.

0

По вопросам рекламы [email protected]