表达式计算——by Java

问题描述

输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。

输入格式

输入一行,包含一个表达式。

输出格式

输出这个表达式的值。

样例输入

1-2+3*(4-5)

样例输出

-4

数据规模和约定

表达式长度不超过100,表达式运算合法且运算过程都在int内进行。

思路

按照计算的优先级,先计算括号内,后进行四则运算。
小括号配对一般用栈去实现,递归就是由系统栈实现,所以可以考虑用递归实现,类似栈的效果。
递归找最内层的小括号,依次进行四则运算,依次返回值,最后得到结果
简单的个人思路,有什么更好的算法,欢迎分享 ^_^

import java.util.*;

public class Main {

    static char[] c;

    public static void main(String args[]){
        Scanner scanner = new Scanner(System.in);
        String s = scanner.nextLine();
        //将表达式分成字符数组
        c = s.toCharArray();

        int result[] = start(0);
        System.out.print(result[1]);
    }

    public static int[] start(int index){
        //将数字和四则运算符依次放入列表
        ArrayList<String> list = new ArrayList<String>(100);
        //用于记录每一次的数字
        String temp = "";

        int i=index;
        for(;i<c.length;i++){
            if(c[i]=='*'||c[i]=='/'||c[i]=='+'||c[i]=='-'){
                if(temp!=""){
                    list.add(temp);
                    temp = "";
                }
                list.add(String.valueOf(c[i]));
            }else if(c[i]=='('){
                //找到括号,进行递归
                int t[] = start(i+1);
                list.add(String.valueOf(t[1]));
                i = t[0];
            }else if(c[i]==')')
                break;
            else{
                temp += c[i];
            }
        }
        if(temp!="")
            list.add(temp);
        //递归返回读取字符数组的位置以及括号内部运算的值
        int r[] = new int[2];
        r[0] = i;
        r[1] = operate(list);
        return r;
    }

    public static int operate(ArrayList<String> list){
        //优先运算乘除,用得到的结果代替乘除运算
        for(int i=1;i<list.size();i++,i++){
            if(list.get(i).equals("*")){
                int num = Integer.valueOf(list.get(i-1))*Integer.valueOf(list.get(i+1));
                list.set(i-1,String.valueOf(num));
                list.remove(i);
                list.remove(i);
                i=i-2;
            }else if(list.get(i).equals("/")) {
                int num = Integer.valueOf(list.get(i - 1))/Integer.valueOf(list.get(i + 1));
                list.set(i - 1, String.valueOf(num));
                list.remove(i);
                list.remove(i);
                i=i-2;
            }
        }
        //进行加减运算
        int result = Integer.valueOf(list.get(0));
        for(int i=1;i<list.size();i++,i++){
            if(list.get(i).equals("+"))
                result += Integer.valueOf(list.get(i+1));
            if(list.get(i).equals("-"))
                result -= Integer.valueOf(list.get(i+1));
        }
        return result;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值