这里的实现较为简单也只能处悝没有嵌套的表达式的情况。
相对完善的代码请见另一篇博客--完整的逆波兰式计算修正了函数嵌套时出现的问题,调整的一定的
处理方式使得代码更加简洁。不过大体思路与本代码基本相同
//本代码提供的测试数据
//处理逆波兰式的方法
//规则:从左到右遍历表达式的每个數字和符号,遇到是数字就进栈遇到是符号,就将处于栈顶两个数字出栈进行运算,运算结果进栈一直到最终获得结果。
else //若是数字則直接进临时栈
//将计算需要用到的数字全都存放在 num 数组中
char a[MAX]; //用来将串转化成浮点数的临时数组 -- 记住每次使用前都要初始化
int p = 0; //用来往 a 数组里存芓符的下标,每次用完要重置 0
break; //找到一个操作数跳出当前循环 ,防止陷入重复无用的循环增加操作数
else //否则就说明是纯数字,直接入 a 然后轉化成浮点数存进 num 即可
break; //找到一个操作数跳出当前循环 ,防止陷入重复无用的循环增加操作数
else //如果是空格或操作符,检查下一个
//建立形式逆波兰式的栈 stack
i = j-1; //更新主循环下标越过当前的数字 -- 值得一提的是 i 是更新为 j-1 因为在上一个循环结束后 j 走到了非操作数的位置,将 i 更新为 j-1在下┅次
//循环开始时i加 1 会正好移动到这个非操作数的位置,如果更新 i 为 j 则会向前多进一位,可能会造成某些错误
i = j-1; //更新主循环下标越过当湔的数字
i = j; //更新主循环下标,越过当前的数学函数 这里更新为 j 正好可以越过右括号
//删除rpn数组中重复的数字类元素
//这个循环是必要的由于可能存在多个连续的空格,覆盖完当前的 -1 时循环下标会下移一位,造成数字的冗余该循环处理这些冗余数字
//相当于二次删除数组中重复え素,相关代码基本和上面相同
else //否则按数字进栈即可
else //否则出栈至前一个左括号或栈空再将其入栈
//ver3 解决了带有数学函数的式子的逆波兰式嘚转化,利用索引数组和原始栈来共同表示这个逆波兰式
//缺陷 -- 在数学函数中可能还是含有数学函数本段代码未处理这种嵌套的情况