C++ c++;中缀到前缀转换?

C++ c++;中缀到前缀转换?,c++,postfix-notation,infix-notation,prefix-operator,C++,Postfix Notation,Infix Notation,Prefix Operator,我正在尝试编写一个简单的程序,将中缀符号转换为前缀和后缀。到目前为止,后缀1工作得很好。然而,我似乎无法正确地进行前缀转换。我使用了调车场算法。如果我的代码有点不寻常(即编写自己的堆栈类而不是使用#include,不必要地使用其他东西),我必须满足作业要求(这是一项大学作业),请事先道歉。以下是我迄今为止所尝试的: #include<iostream> #include<string.h> using namespace std; const int Max=255;

我正在尝试编写一个简单的程序,将中缀符号转换为前缀和后缀。到目前为止,后缀1工作得很好。然而,我似乎无法正确地进行前缀转换。我使用了调车场算法。如果我的代码有点不寻常(即编写自己的堆栈类而不是使用#include,不必要地使用其他东西),我必须满足作业要求(这是一项大学作业),请事先道歉。以下是我迄今为止所尝试的:

#include<iostream>
#include<string.h>
using namespace std;

const int Max=255;
class Stack
{
private:
    char element[Max];
    int top;
public:
    Stack()
    {
        top=-1;
    }
    bool isFull()
    {
        if(top>=(Max-1)) return true;
        else return false;
    }
    bool isEmpty()
    {
        if(top==-1) return true;
        else return false;
    }
    bool push(char x)
    {
        if(!isFull())
        {
            top++;
            element[top]=x;
            return true;
        }
        else
        {
            cout<<"Stack is full"<<endl;
            return false;
        }
    }
    bool pop(char &x)
    {
        if(!isEmpty())
        {
            x=element[top--];
            return true;
        }
        else
        {
            //cout<<"Stack is empty"<<endl;
            return false;
        }
    }
    char retrieve()
    {
        if(!isEmpty())
        {
            return element[top];
        }
        else
        {
            //cout<<"Stack is empty"<<endl;
            return ' ';
        }
    }
};


class Converter
{
private:
public:
    Converter(){}
    bool isOperator(char x)
    {
        if(x=='+'||x=='-'||x=='*'||x=='/'||x=='^'||x=='('||x==')') return true;
        else return false;
    }
    bool isOperand(char x)
    {
        if(x>='0'&&x<='9') return true;
        else return false;
    }
    int Hierarchy(char x)
    {
        if(x=='+'||x=='-') return 1;
        else if(x=='*'||x=='/') return 2;
        else if(x=='^') return 3;
        else return 0;
    }
    char*ToPostfix(char infix[])
    {
        Stack stack1;
        char res[20];
        int resindex=0;
        for(int i=0;i<strlen(infix);i++)
        {
            if(isOperator(infix[i]))
            {
                if(infix[i]=='(')
                {
                    stack1.push(infix[i]);
                }
                else if(infix[i]==')')
                {
                    while(stack1.retrieve()!='(')
                    {
                        stack1.pop(res[resindex++]);
                    }
                    stack1.pop(res[resindex]);
                }
                else 
                {
                    while(Hierarchy(infix[i])<=Hierarchy(stack1.retrieve()))
                    {
                        stack1.pop(res[resindex++]);
                    }
                    stack1.push(infix[i]);
                }
            }
            else if(isOperand(infix[i]))
            {
                res[resindex++]=infix[i];
            }
        }
        while(!stack1.isEmpty())
        {
            stack1.pop(res[resindex++]);
        }
        res[resindex]='\0';
        return res;
    }
    char*ToPrefix(char infix[])
    {
        char res[20];
        strcpy(res,strrev(infix));
        for(int i=0;i<strlen(res);i++)
        {
            if(res[i]=='(') 
            {
                res[i]=')';
            }
            else if(res[i]==')')
            {
                res[i]='(';
            }
        }
        strcpy(res,ToPostfix(res));
        strcpy(res,strrev(res));
        return res;
    }
};
int main()
{
    Converter convert;
    char infix[20];
    cout<<"Enter infix expression: ";
    cin>>infix;
    cout<<endl<<"Prefix: "<<convert.ToPrefix(infix)<<endl;
    cout<<"Postfix: "<<convert.ToPostfix(infix)<<endl;
    return 0;
}
#包括
#包括
使用名称空间std;
常数int Max=255;
类堆栈
{
私人:
字符元素[Max];
int top;
公众:
堆栈()
{
top=-1;
}
bool isFull()
{
if(top>=(Max-1))返回true;
否则返回false;
}
布尔是空的
{
if(top==-1)返回true;
否则返回false;
}
布尔推送(字符x)
{
如果(!isFull())
{
top++;
元素[top]=x;
返回true;
}
其他的
{

cout实际上,这两个答案都是正确的,因为如果乘法在中缀中首先出现,您可以切换除法和乘法的顺序。因此,在这种情况下,您的错误答案是正确的。但是,存在从左到右的优先级,因此您的层次结构处理不正确:如果(x='*'| x='/'),则更改
elsereturn 2;

听起来您可能需要学习如何使用调试器来逐步调试代码。有了一个好的调试器,您可以逐行执行您的程序,并查看它与您期望的有何偏差。如果您要进行任何编程,这是一个必不可少的工具。进一步阅读:@NathanOliver我已经调试了这个20+ti在过去的两个小时里,我一直没有弄清楚前缀算法怎么可能是错误的,我甚至在谷歌上也没有找到任何帮助。如果我听起来很愚蠢和绝望,我很抱歉,但我确定。不确定,但在再次看了代码之后,我猜更改
while(Hierarchy(infix[I])