【递归】波兰式、表达式求值


解决问题本身就是递归形式

波兰式定义:
1)一个数是波兰式,值为该数
2)“运算符 波兰式 波兰式”是波兰式,值是两个波兰式运算的结果

表达式定义:
输入为四则运算表达式,仅由整数、 +、-、 *、 / 、 (、 )组成,没有空格,要求求其值。假设运算符结果都是整数。 "/"结果也是整数

题解

题解1:波兰式求值
import java.util.*;

public class Main {

    public static double exp(){
        String s;
        Scanner sc = new Scanner(System.in);
        s = sc.next().trim();
        switch (s){
            case "+":return exp()+exp();
            case "-":return exp()-exp();
            case "*":return exp()*exp();
            case "/":return exp()/exp();
            default: return Double.valueOf(s);
        }
    }

    public static void main(String[] args){
        System.out.println(exp());
    }
}
题解2:表达式求值
import java.util.*;

public class Main {

    public static String expression;

	//表达式是由项term通过+-构成的,项term是由因子factor通过*/构成的。
    public static int factorValue(){//求一个因子的值
        int result = 0;
        char c = expression.charAt(0);
        if( c == '(') {
            expression = expression.substring(1);
            result = expressionValue();
            expression = expression.substring(1);
        }
        else {
            while(Character.isDigit(c)) {
                result = 10 * result + c - '0';
                expression = expression.substring(1);
                if(expression==null||expression.length()==0) break;
                c = expression.charAt(0);
            }
        }
        return result;
    }
	
    public static int termValue(){//求一个项的值
        int result = factorValue(); //求第一个因子的值
        while(true) {
            if(expression==null||expression.length()==0) break;
            char op = expression.charAt(0);
            if( op == '*' || op == '/') {
                expression = expression.substring(1);
                int value = factorValue();
                if( op == '*')
                    result *= value;
                else result /= value;
            }
            else
                break;
        }
        return result;
    }

    public static int expressionValue(){//求一个表达式的值
        int result = termValue(); //求第一项的值
        boolean more = true;
        while(more) {
            if(expression==null||expression.length()==0) break;
            char op = expression.charAt(0); //看一个字符,不取走
            if( op == '+' || op == '-' ) {
                expression = expression.substring(1); //从输入中取走一个字符
                int value = termValue();
                if( op == '+' ) result += value;
                else result -= value;
            }
            else more = false;
        }
        return result;
    }

    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        expression = scanner.next().trim();
        System.out.println(expressionValue());
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值