四则运算算法实现

四则运算

1. 中缀表达式转后缀表达式

中缀表达式 9+(3-1)×3+10÷2 转化为后缀表达式 9 3 1 - 3 * + 10 2 / +

规则

  1. 遇到数字就直接输出到后缀表达式中,遇到操作符就判断其优先级,并将其压入栈中
  2. 如果栈顶元素的优先级大于等于当前操作符,则先将栈顶元素弹出并输出到后缀表达式中,再将当前操作符压入栈中。
  3. 如果遇到了左括号,则直接将其压入栈中,如果遇到了右括号,则弹出栈中的元素,直到遇到了左括号为止,并将这些元素输出到后缀表达式中。
  4. 最后,将栈中剩余的元素依次弹出,并输出到后缀表达式中。

演示

  1. 初始化一空栈,用来对符号进出栈使用。
  2. 第一个字符是数字9,输出9,后面是符号“+”,进栈。
  3. 第三个字符是“(”,依然是符号,因其只是左括号,还未配对,故进栈。
  4. 第四个字符是数字3,输出,总表达式为93,接着是“-”,进栈。
  5. 接下来是数字1,输出,总表达式为 9 3 1,后面是符号“)”,此时,我们需要去匹配 此前的“(”,所以栈顶依次出栈,并输出,直到“(”出栈为止。此时左括号上方只有“-”, 因此输出“-”。总的输出表达式为 9 3 1 -。
  6. 紧接着是符号“×”,因为此时的栈顶符号为“+”号,优先级低于“×”,因此不输出,“×”进栈。接着是数字3,输出,总的表达式为 9 3 1 - 3。
  7. 之后是符号“+”,此时当前栈顶元素“×”比这个“+”的优先级高,因此栈中元素出栈并输出(没有比“+”号更低的优先级时一直出栈,所以全部出栈),总输出表达式为9 3 1 - 3 × +。然后将当前这个符号“+”进栈。也就是说,前6张图的栈底的“+”是指中缀表达式中开头的9 后面那个“+”,而下图的左图中的栈底(也是栈顶)的“+”是指“9+(3-1)×3+”中的最后 一个“+”。
  8. 紧接着数字10,输出,总表达式变为9 3 1 - 3 × + 10。后是符号“÷”,所以“/”进栈。
  9. 最后一个数字2,输出,总的表达式为9 3 1 - 3 × + 10 2。
  10. 因已经到最后,所以将栈中符号全部出栈并输出。最终输出的后缀表达式结果为 9 3 1 - 3 × + 10 2 / +。

2. 后缀表达式计算结果

规则

  1. 遍历后缀表达式,如果遇到数字则直接入栈,如果遇到操作符,则弹出栈顶的两个元素,进行计算后将结果入栈。
  2. 最终,栈内剩余的元素就是整个表达式的计算结果。

演示

  1. 初始化一个空栈。此栈用来对要运算的数字进出使用。
  2. 后缀表达式中前三个都是数字,所以9、3、1进栈。
  3. 接下来是“-”,所以将栈中的1出栈作为减数,3出栈作为被减数,并运算3-1得到 2,再将2进栈。
  4. 接着是数字3进栈。
  5. 后面是“*”,也就意味着栈中3和2出栈,2与3相乘,得到6,并将6进栈。
  6. 下面是“+”,所以栈中6和9出栈,9与6相加,得到15,将15进栈。
  7. 接着是10与2两数字进栈。
  8. 接下来是符号“/”,因此,栈顶的2与10出栈,10与2相除,得到5,将5进栈。
  9. 最后一个是符号“+”,所以15与5出栈并相加,得到20,将20进栈。
  10. 结果是20出栈,栈变为空。

参考案例

开篇寄语

开篇寄语 🙏

从今天起,我就开始着手准备写自己的博客了,把自己的一些想法,心得,给记录下来。
以前,无论是学习还是做一些小项目,都是零零散散的,没有进行一个很好的归纳与总结,这就导致最终都没有很好的形成一个系统的知识框架,所以这个博客站,就此产生了,我会努力坚持更新这个博客站,尽管以后的更新内容会很杂(本人学的东西很杂,😂)。