其他分享
首页 > 其他分享> > 中缀 后缀表达式 四则运算

中缀 后缀表达式 四则运算

作者:互联网

中缀表达式转化为后缀表达式,并通过后缀表达式计算值

中缀表达式转化为后缀表达式

转化规则:

举例:3 * (2 + 5) - 4 / 2 过程如下

  1. 建立操作符栈,以及存储后缀表达式的队列:

    image-20220210203654538

    image-20220210203712591

  2. 从头到尾扫描中缀表达式,首先扫描到 3,为操作数,添加到队列尾,作为后缀表达式;

  3. 然后扫描到 * 操作符,此时栈顶为空,即 op 优先级大于栈顶,入栈;

  4. 扫描到 ( ,入栈;

  5. 扫描到 2,为操作数,添加到队列尾;

  6. 扫描到 +,为操作符,栈顶元素为 (,无优先级关系,入栈;

  7. 扫描到 5,为操作数,添加到队尾;

    2~7 过程生成的图如下:

    image-20220210204926194

    image-20220210204938758

  8. 扫描到 ),出栈一直到 ( 也出栈为止,出栈元素(除 ( 外)添加到队列尾;完成后如下图:

    image-20220210205236216

    image-20220210205250147

  9. 继续扫描中缀表达式,扫描到 -,优先级低于栈顶(*);出栈一直到栈顶优先级高于 - 或栈为空时,出栈停止,- 入栈;注意所有出栈元素依次添加到队列尾;如下图:

    image-20220210205824400

    image-20220210205839529

  10. 扫描到 4,添加到队尾;

  11. 扫描到 /,优先级大于栈顶(-),入栈;

  12. 扫描到 2,添加到队尾;

    10~12 过程生成图如下:

    image-20220210210133006

    image-20220210210145585

  13. 至此,中缀表达式扫描完毕;将栈内元素依次出栈添加到队尾;完成后栈为空,队列如下:

    image-20220210210348576

  14. 队列元素依次出队输出可得后缀表达式:3 2 5 + * 4 2 / -

后缀表达式生成后,将对后缀表达式进行计算;

计算后缀表达式

计算规则:

以上面得出的后缀表达式 3 2 5 + * 4 2 / - 为例,计算过程如下:

  1. 扫描得到 3,为操作数,入栈;

  2. 扫描得到 2,为操作数,入栈;

  3. 扫描得到 5,为操作数,入栈;

    1~3 过程结果如下:

    image-20220210213259087

  4. 扫描到 +,为操作符,依次出栈两次,出栈顺序为 5(top1) 2(top2);使用操作符运算:2 + 5

    结果为 7 入栈;

    image-20220210213347587

  5. 扫描到 *,依次出栈两次,出栈顺序为 7(top1) 3(top2);使用操作符运算:3 * 7

    结果为 21 入栈;

    image-20220210213428570

  6. 扫描到 4 为操作数,入栈;

  7. 扫描到 2 为操作数,入栈;

    image-20220210213448049

  8. 扫描到 /,依次出栈两次,出栈顺序为 2(top1) 4(top2);使用操作符运算:4 / 2

    结果为 2 入栈;

    image-20220210213514630

  9. 扫描到 -,依次出栈两次,出栈顺序为 2(top1) 21(top2);使用操作符运算:21 - 2

    结果为 19 入栈;


10. 扫描完毕,栈内元素即为最终结果 19;3 * (2 + 5) - 4 / 2 = 19;

代码实现

读取一串字符串,将其转换为后缀表达式,考虑如下几点:

其他

至此,一个能够处理整数的简易计算器便实现了;

当然本例中采取的方式有点复杂,更简单的做法可以直接通过分隔符分离;例如 32 + 3.14 按空格直接分离可以直接得到操作数和操作符 32, +, 3.14 这样便很容易的分离出操作数,不管其为一个多位数还是浮点数,然后剩余的原理部分与本例相同;

一个用 Java 采用此类方式实现的简易计算器:链接

标签:操作数,出栈,中缀,后缀,四则运算,扫描,入栈,表达式,op
来源: https://www.cnblogs.com/max-Ernest/p/15916628.html