转载来自https://blog.csdn.net/huangziguang/article/details/105739833 ** 注释中加了一些自己的见解,如有错请指出谢谢!!** double ComputeInfix(char* s)//传递的s是中缀表达式 //计算中缀表达式 { // 请在此添加代码,补全函数ComputeInfix,计算中缀表达式 /********** Begin *********/ int i=0;//数组下标 LinkStack* so = LS_Create(); // 创建运算符栈 LinkStack* sd = LS_Create(); //创建操作数栈 while (s[i]) { if (s[i] >= '0'&&s[i] <= '9')//当检测的数组该位数是一个0-9的数就压入操作数栈 { LS_Push(sd, s[i++] - 48);//因为是字符类型 所以需要ASCII码-48 continue;//不执行本次循环后的操作 直接判断循环条件进而进入下一循环 } if (s[i] == '('||LS_IsEmpty(so))//检测为左括号或者为空的情况下压入运算符栈 { LS_Push(so, s[i++]); continue; } if (s[i] == ')')//检测为右括号的情况下进行括号内的计算 直至遇到左括号 { T top; while (LS_Top(so, top) && top != '(') { compute(so, sd); } LS_Pop(so, top);//把左括号出栈 i++;//数组往下走 continue; } if (s[i] == '*'||s[i] == '/')//检测为乘号和除号的情况 { T c; LS_Top(so, c); if (c == '*' || c == '/')//如果在这个字符入栈之前 栈顶元素为乘除的话 就先进行一次乘除 确保栈中最多只有左括号和一个运算符 再将乘除号压入栈中 { compute(so, sd); } LS_Push(so, s[i++]); continue; } if (s[i] == '+' || s[i] == '-') { T top; while (LS_Top(so, top) && top != '(')//遇到加号就将前面的运算符(除了左括号)弹出 以确保乘除的优先级 和栈中最多只有左括号和一个运算符 { compute(so, sd); } LS_Push(so, s[i++]); continue; } } while(!LS_IsEmpty(so))//将剩下的运算符进行操作 { compute(so, sd); } T res; LS_Top(sd, res); LS_Free(so); LS_Free(sd); return res; /********** End **********/ }