Я пытаюсь вычислить инфиксное выражение, используя два стека, однако моя программа продолжает получать ошибку сегментации, и я не уверен, что является причиной ошибки. Я попытался следовать псевдокоду для алгоритма RPN, однако я думаю, что моя проблема возникает, когда я вызываю doOperation. Я не уверен, какие параметры включить при вызове этого. Я знаю, что мне нужно (ValueType, char, ValueType), однако я не хочу писать doOperation (ch, ch, ch), так как я почти уверен, что это не поможет. Может кто-нибудь помочь мне выяснить способ вызова этой функции? (Я почти уверен, что это одна из причин, вызывающих ошибку сегментации).
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.
Попробуйте удалить эти строки из 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
, поскольку это то, что есть на самом деле. «Операция» — это то, что происходит, когда вы выполняете оператор.