Я собрал следующий код, чтобы преобразовать инфикс в постфикс. Однако это работает только тогда, когда инфикс заключен в скобки, и я понятия не имею, почему. Я пробовал много базовых c вещей, таких как прямое / косвенное присвоение значений.
Вот код
int prec(char c)
{
if(c == '^')
return 3;
else if(c == '*' || c == '/')
return 2;
else if(c == '+' || c == '-')
return 1;
else
return -1;
}
class Expressions
{
public:
std::stack <char> inFix;
std::stack <char> postFix;
std::vector <char> postFixString;
void ptInFix(); // prints the infix and deletes the stack, for testing only, need to tweak later
void ptPostFix();
void inFixtoPostFix();
};
void Expressions::inFixtoPostFix()
{
int size = inFix.size();
for(int i=0;i<size;i++)
{
if((inFix.top() >= 'a' && inFix.top() <= 'z')||(inFix.top() >= 'A' && inFix.top() <= 'Z'))
{
postFixString.push_back(inFix.top());
inFix.pop();
}
else if(inFix.top() == '(')
{
postFix.push(inFix.top());
inFix.pop();
}
else if(inFix.top() == ')')
{
while(postFix.top() != '(')
{
postFixString.push_back(postFix.top());
postFix.pop();
}
if(postFix.top()=='(')
{
postFix.pop();
}
inFix.pop();
}
else if(inFix.top() == '^' || inFix.top() == '*' || inFix.top() == '/' || inFix.top() == '+' || inFix.top() == '-')
{
if(postFix.empty())
{
postFix.push(inFix.top());
inFix.pop();
}
else if(postFix.empty()!=1)
{
while((prec(postFix.top())>=prec(inFix.top())))
{
char c = postFix.top();
postFix.pop();
postFixString.push_back(c);
}
postFix.push(inFix.top());
inFix.pop();
}
}
}
int s = postFix.size();
for(int i=0;i<s;i++)
{
postFixString.push_back(postFix.top());
postFix.pop();
}
}
И это работает
Expressions test;
char infix[] = ("(A+B)*(C+D)");
for(int i=(sizeof(infix)-1);i>=0;i--)
{
test.inFix.push(infix[i]);
}
test.inFixtoPostFix();
std::cout<<"\n";
for(int i=0; i<test.postFixString.size(); i++)
{
printf("%c ",test.postFixString[i]);
}
std::cout<<"\n";
Но это не делает, вообще ничего не выводит
Expressions test2;
char infix2[] = ("A+B*C+D");
for(int i=(sizeof(infix2)-1);i>=0;i--)
{
test2.inFix.push(infix2[i]);
}
test2.inFixtoPostFix();
std::cout<<"\n";
int s = test2.postFixString.size();
for(int i=0; i<s; i++)
{
std::cout<<(test2.postFixString[i]) ;
}
std::cout<<"\n";
Так как каждый раз, когда я запускал второй тестовый случай, окно командной строки изучается, так что я подозреваю, что есть какая-то проблема с памятью, но не знаю, где. У меня было много выходов в реальной функции для отладки, но это не помогло, поэтому я удалил их для ясности.