(算法)java完成解析数学算式(计算器)三 —— 用栈解析

本文介绍了如何使用Java通过解析后缀表达式(逆波兰表达式)来处理数学算式,包括从中缀表达式转换为后缀表达式的方法,以及基于栈的解析算法。通过示例展示了程序执行过程和简化优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、程序要求

解析一般数学算式,实现简单的带括号的加减乘除运算。

二、基本思路

前面两篇介绍了直接解析字符串和用数组容器辅助解析的两种方式,这次再介绍最常用的解析算法——解析后缀表达式(逆波兰表达式)。

三、逆波兰表达式及其得到算法

1、逆波兰表达式

 也即后缀表达式,指的是不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则)。(摘自百度),既然没了运算符的优先规则,那么计算机解析起来自然容易的多。

 对于我们常见的表达式,称为中缀表达式,每个中缀表达式都有对应的后缀表达式。如:
中缀表达式:-2*(1+6/3)+4
后缀表达式:-2 1 6 3 / + * 4 +
(这里为了区分负号和减号,我在数字与数字、数字与符号之间都加了空格,至于怎么从中缀表达式得到后缀表达式,后面有介绍及参考程序)

 而在解析后缀表达式时,只需要遵守以下原则即可:

  • 从左往右遍历
  • 遇到数字直接放入容器
  • 遇到运算符,将最后两个数字取出,进行该运算,将结果再放入容器
  • 遍历结束后,容器中的数字即为运算结果

按这个过程走下来,自然而然的想到用是最合适的。
现只需想办法由输入的中缀表达式转为后缀表达式即可完成解析。

2、由中缀表达式得到后缀表达式的算法

由中缀表达式得到后缀表达式,只要遵守以下步骤即可:

  • 首先设置运算符的优先级(这样设置也是为了简化程序):
    • ”null” 栈顶若为空,假设优先级为0
    • “(” 优先级设为1
    • “+-” 优先级设为2
    • “*/” 优先级设为3
  • 从左向右遍历中缀表达式
  • 遇到数字直接输出
  • 遇到符号
    • 遇到左括号,直接压栈
    • 遇到右括号,弹栈输出直到弹出左括号(左括号不输出)
    • 遇到运算符,比较栈顶符号,若该运算符优先级大于栈顶,直接压栈;若小于栈顶,弹栈输出直到大于栈顶,然后将改运算符压栈。
    • 最后将符合栈弹栈并输出

现根据这个原则,手动模拟一遍转换过程:
还是以-2*(1+6/3)+4为例
这里写图片描述
这里写图片描述

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

四、代码一

环境:

  • Eclipse Java EE IDE(Version: Oxygen.1a Release (4.7.1a))
  • jdk1.8.0_131

先写一个最基本的两位数四则运算方法,比较简单,没有写注释:

private static double doubleCal(double a1, double a2, char operator) throws Exception {
        switch (operator) {
        case '+':
            return a1 + a2;
        case '-':
            return a1 - a2;
        case '*':
            return a1 * a2;
        case '/':
            return a1 / a2;
        default:
            break;
        }
        throw new Exception("illegal operator!");
    }

写一个获得优先级的方法:

private static int getPriority(String s) throws Exception {
        if(s==null) return 0;
        switch(s) {
        case "(":return 1;
        case "+":;
        case "-":return 
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值