В настоящее время я работаю над проектом для преобразования из postfix в infix с использованием стека в виде отдельного списка. Мне удалось преобразовать выражения, такие как ab+
, в (a+b)
, однако, когда выражение становится длиннее, например ab+cd*-
. Это не работает. Я рассматриваю возможность перевода ранее преобразованного выражения обратно в стек, но стек имеет тип char, а выражение - это строка, и он жалуется, когда я пытаюсь его оттолкнуть. Должен ли я сделать его шаблоном, и если да, то как бы я это сделал или есть еще что-нибудь, чтобы решить эту проблему.Преобразование из Infix в Postfix с использованием стеков (C++)
Вот мой код:
#include "stack.h"
void convert(string expression){
stack c;
string post = " ";
string rightop = "";
string leftop = "";
string op = "";
for (int i = 0; i <= expression.length(); i++){
c.push(expression[i]);
c.print();
if (expression[i] == '*' ||
expression[i] == '+' ||
expression[i] == '-' ||
expression[i] == '/'){
cout << c.top() << endl;
leftop = c.top();
cout << leftop << endl;
c.pop();
rightop = c.top();
cout << rightop << endl;
c.pop();
op = c.top();
cout << op << endl;
//c.pop();
post = "(" + leftop + " " + op + " " + rightop + ")";
cout << post << endl;
}
//c.push(post);
}
}
int main(){
string expression;
cout << " Enter a Post Fix expression: ";
getline(cin, expression);
convert(expression);
return 0;
}
Поскольку вы хотите преобразовать целые выражения в нотацию infix, ваш стек должен иметь возможность хранить целые выражения, а не только символы. То есть всякий раз, когда вы разбираете выражение, вы должны подталкивать его к стеку. Вы можете нажать целое выражение по одному символу за раз, если вы разделите их на скобки, но тогда у вас есть сложность подсчета открытой круглой скобки и т. Д. – EdMaster