求表达式(java)

package cn.itcast.算法;

import java.util.Deque;
import java.util.LinkedList;

// 公式 字符串 求值
/*
   说明:
     1. 给定的 字符串 一定 正确的
     2. 不用考虑 发生 溢出的 情况
     3. 如果 是 负数, 就要 用负数 括起来

 */
public class Test02 {
    public static int getValue(String exp){
        return value(exp.toCharArray(),0)[0];
    }
    public static int[] value(char[] chars,int index){
        // 定义 一个 容器 保存 的 是 字符串类型
        Deque<String> deque=new LinkedList<>();
        int pre=0; // 用来 保存 字符串 中 的数据
        int[] bra=null; // 用来 保存 有括号里面的值  和 计算到 字符串的下标

        // 字符串 没到 结束  并且 没有  遇到 有括号
        while (index<chars.length&& chars[index]!=')'){
            // 说明 此字符 为 数字类型
            // 用完 当前 字符 后 index  指针 往后 移动 一位
            if(chars[index]>='0'&&chars[index]<='9'){
                pre=pre*10+chars[index++]-'0';
            }else if(chars[index]!='('){  //  遇到了 + - * /
                 // 如果 遇到到了 + - * /
                // 把 数字(pre) 拿去 运算
                addNum(deque,pre);
                // 运算 完了之后  会把  数字  再次 放在 队列里面

                // 再把 把当前的 运算符 添加到 队列中
                // 用完 当前 字符后 , 将 index 指针 往后 移动一位
                deque.addLast(String.valueOf(chars[index++]));
                pre=0;
            }else {
                // 遇到了 左括号
                // 如果遇到了 左括号  递归 调用 此方法

                // 把 括号里面 运算完 的 结果 和 运算到 那一位的 下标  返回给我 ,

                bra=value(chars,index+1);// 当前 字符  是 '('  当然 要 取到 下一位   , 就是 跳过 左括号
                pre=bra[0];
                index=bra[1]+1;
            }
        }
        //  运算这里 必然 是 遇到了 右括号
        addNum(deque,pre);
     return new int[]{getNum(deque),index};
    }
    public static void addNum(Deque<String> deque,int num) {
        //  遇到了  操作符
        // 它把 操作 符 的 前一个 数字 给我了
        // 此时 队列 的头部 保存 的必然是 操作 符
        if (!deque.isEmpty()) {
            int cur = 0;
            // 取出 队列 里面 的 操作符
            String top = deque.pollLast();
            // 判断 是 + - * / 哪一个
            //  如果  是 + - 再次 添加 到 队列中
            if ("+".equals(top) || "-".equals(top)) {
                deque.addLast(top);
            }else {
                // 如果 是 * - 的 话 , 把 它们 的结果 计算出来
                // 再次 入队列

                // 再 把 队列 头部 的数字 取出来
                cur=Integer.valueOf(deque.pollLast());
                //  这里 变量 重利用了
                num="*".equals(top)?(cur*num):(cur/num);
            }
        }
        // 再把  运算好 的 结果   转化为 字符串 放入 队列中
        deque.addLast(String.valueOf(num));
    }
    //  计算 最终 结果 此时 里面只有  + -数字
    public  static int getNum(Deque<String> deque){
        int res=0;
        boolean add=true;
        String cur=null;
        int num=0;
        while (!deque.isEmpty()){
            cur=deque.pollLast();
            if(cur.equals("+")){
                add=true;
            }else if("-".equals(cur)){
                add=false;
            }else {
                num =Integer.valueOf(cur);
                res+=add?num:(-num);
            }
        }
        return res;
    }
    public static void main(String[] args) {
        String str="1+1+(3*6)+9";
        int value = getValue(str);
        System.out.println(value);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值