Требуется помощь в разбивке выражений постфикса и выводе каждой отдельной операции.Моя проблема не в оценке действительного выражения, а в печати каждой отдельной операции перед оценкой.
Я использую C ++ для написания программы, которая оценивает выражения postfix.Типы выражений, которые будут приняты, находятся в инфиксной нотации и используют заглавные буквы (AZ) и эти четыре операции: *, /, + и -.
Примером этого может быть: (A + B) * (F - G)
Я написал функцию, которая меняет инфикс на постфикс:
AB+FG-*
Теперь я хотел бы написать функцию, которая выводит каждую отдельную операцию.Для приведенного выше примера это будет выглядеть примерно так:
Операции:
AB +
FG-
AB + FG - *
Необходимо будет выводить операции в порядке приоритета.Так как A и B заключены в скобки, сначала их нужно будет сделать, и так далее.Я попытался написать функцию, которая принимает выражение постфикса в качестве ввода и ничего не возвращает.Функция создает стек типа char и перебирает выражение от начала до конца.
Если символ является операндом, он помещается в стек.Если символ является оператором, два верхних значения стека сохраняются в переменных типа char и затем выводятся с соответствующим оператором.
Однако моя функция, похоже, не выводит операции правильно.
#include<iostream>
#include<stack>
#include <algorithm>
#include <cstdlib>
#include<string>
void operations(string exprsn) {
char op1, op2;
int len, x, j = 0;
len = exprsn.length();
stack<char>s;
string ns;
for (int i = 0; i < len; i++) {
if (exprsn[i] >= 'A' && exprsn[i] <= 'Z') {
s.push(exprsn[i]);
}
else if (isOperator(exprsn[i])) {
op1 = s.top();
s.pop();
op2 = s.top();
s.pop();
switch (exprsn[i]) {
case '+':
s.push(op2 + op1 + '+' );
cout << op2 << op1 << "+\n";
break;
case '-':
s.push(op2 + op1 + '-');
cout << op2 << op1 << "-\n";
break;
case '*':
s.push(op2 + op1 + '*');
cout << op2 << op1 << "*\n";
break;
case '/':
s.push(op2 + op1 + '/');
cout << op2 << op1 << "/\n";
break;
}
}
}
}
int main(){
string s = "AB+CD-*";
operations(s);
return 0;
}
Ожидаемый выход:
AB +
CD-
AB + CD - *
Фактический выход:
AB +
CD-
«┤ *
Я не уверен, что происходит с последней строкой, но я думаю, что это как-то связано с тем, как я толкаюсимволов в стек.
Вот еще один пример:
Выражение инфикса: (A + B) / C + (D - E) * F * (G - H)
После преобразования в постфиксную запись:
AB+C/DE-F*GH-*+
Ожидаемый результат:
AB+
DE-
GH-
DE-F*
GH-*
AB+C/
AB+C/DE-F*GH-*+
Фактический результат:
AB +
«C /
DE-
╢F *
GH-
& ╝ *
+
Я знаю, что ягде-то идет ужасно неправильно, и я с трудом понимаюING.Любая помощь очень ценится.Спасибо.