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