Stack实现表达式的转换
1.Stack实现中缀转后缀
从左至右扫描表达式,遇到操作数直接写出来,若遇到运算符,则入栈(拿当前扫描运算符A和栈顶运算符B相比,若A的优先级小于等于B,则B出栈并写入到当前的结果表达式中,循环该过程直到A优先级大于B',则A入栈)对于表达式中有括号的,遇到'('直接入栈,当栈顶元素为'('所有扫描到的运算符都入栈,当扫描到')'则执行一系列的出栈操作,把当前栈中的从栈顶到'('的都出栈,并写入结果表达式中。'('丢掉不写。最后,若扫描完,栈中还有剩余运算符,则将其全部出栈并写入表达式。
void infixToPostFix(char infix[],char s2[],int &top2){ char s1[MaxSize]; int top1=-1; int i=0; while(infix[i] !='\0'){ if('0'<= infix[i] && infix[i]<='9'){ s2[++top2]=infix[i]; ++i; }else if(infix[i] == '('){ s1[++top1]='('; ++i; }else if(infix[i] == '+'||infix[i]=='-'||infix[i]=='*'||infix[i]=='/'){ if(top1 == -1||s1[top1]=='('||getPriority(infix[i])>getPriority(s1[top1])){ s1[++top1]=infix[i]; ++i; }else{ s2[++top2]=s1[top1--]; } }else if(infix[i] == ')'){ while(s1[top1] !='(') { s2[++top2]=s1[top1--]; } --top1; ++i; } while(top1 != -1){ s2[++top2]=s1[top1--]; } } }
2.Stack实现中缀转前缀
与1.相比,顺序从右到左,括号的顺序相反,🔺运算符A<栈顶运算符B,则B出栈也就是说A优先级>B,A入栈
void infixToPreFix(char infix[],int len,char s2[],int &top2){ char s1[MaxSize]; int top1=-1; int i=len-1; while(i>=0){ if('0'<=infix[i] && infix[i]<='9'){ s2[++top2]=infix[i]; i--; }else if(infix[i] == ')'){ s1[++top1]=')'; --i; }else if(infix[i]=='+'||infix[i]=='-'||infix[i]=='*'||infix[i]=='/'){ if(top1==-1||s1[top1]==')'||getPriority(infix[i])>=s1[top1]){ s1[++top1]=infix[i]; --i; }else{ s2[++top2]=s1[top1--]; } }else if(infix[i] == '('){ while(s1[top1] !=')'){ s2[++top2]=s1[top1--]; } --top1; --i; } } while(top1 !=-1){ s2[++top2]=s1[top1--]; } }