C++ cli 中缀到后缀的转换

C++ cli 中缀到后缀的转换,c++-cli,infix-notation,C++ Cli,Infix Notation,我正在尝试将中缀表达式转换为后缀表达式的代码。目前,该程序工作正常,如果我输入例如5+6,它将输出正确答案,即5+6+。当我为例如5+6-3输入多个运算符时,会出现问题,它会输出错误的答案+3-。有人能指出我在哪里出错吗?提前谢谢 void main(){ Stack *s = new Stack; string input; cout <<"Enter Expression"<<endl; cin>>input; InfixToPostfix(inp

我正在尝试将中缀表达式转换为后缀表达式的代码。目前,该程序工作正常,如果我输入例如5+6,它将输出正确答案,即5+6+。当我为例如5+6-3输入多个运算符时,会出现问题,它会输出错误的答案+3-。有人能指出我在哪里出错吗?提前谢谢

void main(){

Stack *s = new Stack;
string input;


cout <<"Enter Expression"<<endl;
cin>>input;

InfixToPostfix(input);

system("PAUSE");

}





string  InfixToPostfix(string input){

Stack *S = new Stack();

string postfix = "";
for (int i=0; i < input.length();i++){
    if (input[i]== ' '||input[i]==',') continue;
    else if (IsOperator(input[i]))
    {
        while(!S->IsStackEmpty() && S->StackTop() != '(' &&   HasHigherPrecedence(S->StackTop(),input[i]))
        {
            postfix=S->StackTop();
            S->Pop();
        }
        S->Push(input[i]);
    }
    else if(IsOperand(input[i]))
    {
        postfix +=input[i];
    }
    else if (input[i] == '(')
    {
        S->Push(input[i]);
    }
    else if (input[i]==')')
    {
        while(!S->IsStackEmpty() && S->StackTop() != '('){
            postfix += S->StackTop();
            S->Pop();
        }
        S->Pop();
    }
 }
while(!S->IsStackEmpty()){
    postfix +=S->StackTop();

    S->Pop();
}

cout <<""<<postfix;
return postfix;

 }

 bool IsOperand(char C)
 {

if(C>= '0' && C<= '9') return true;
if(C>= 'a' && C<= 'z') return true;
if(C>= 'A' && C<= 'Z') return true;
return false;
}

bool IsOperator(char C)
{
if(C=='+' || C== '-' || C =='*' || C == '/' ||C == '$')

{
    return true;
}else{
    return false;
}
}


int IsRightAssociative(char op)

{
if(op=='$'){
    return true;
}else{

return false;
}
}
int GetOperatorWeight(char op){

int weight = -1;
switch(op)
{
case'+':
case '-':
weight=1;
break;
case '*':
case '/':
weight=2;
break;
case '$':
weight=3;
break;
}

return weight;
}

int HasHigherPrecedence ( char op1, char op2)

{

int op1Weight= GetOperatorWeight(op1);
int op2Weight = GetOperatorWeight(op2);


if(op1Weight == op2Weight)
{

    if(IsRightAssociative(op1))
{
        return false;
    }else{
        return true;
    }
    return op1Weight > op2Weight ? true:false;
}
}

一个建议是:使用树而不是堆栈作为中间数据结构。让优先级最低的运算符作为树的根,并从那里递归地构建它。然后从左到右遍历树,再次递归地生成后缀版本。这样,您还可以跟踪后缀版本的最大堆栈深度,这可能很重要,因为许多手持RPN计算器的堆栈深度非常有限

谢谢你的回复!是的,我知道使用树而不是堆栈更容易实现RPN计算器。但是我已经用堆栈实现了后缀,所以我只是计划用堆栈实现中缀。另外,我对树如何工作的理解还不是很好,这就是为什么我想使用堆栈。它看起来像是一个规则的C++,有一个未知的栈类…