Code Interview Guide for Programmers Chapter 5 String Questions Formula String Evaluation

topic

公式字符串求值

java code

package com.lizhouwei.chapter5;

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

/**
 * @Description: 公式字符串求值
 * @Author: lizhouwei
 * @CreateDate: 2018/4/25 20:42
 * @Modify by:
 * @ModifyDate:
 */
public class Chapter5_15 {

    public int getValue(String str) {
        char[] chars = str.toCharArray();
        int[] res = value(chars, 0);
        return res[0];
    }

    public int[] value(char[] chars, int i) {
        int[] res = null;
        int num = 0;
        Deque<String> deque = new LinkedList<>();
        for (; i < chars.length && chars[i] != ')'; i++) {
            if (chars[i] >= '0' && chars[i] <= '9') {
                num = num * 10 + chars[i] - '0';
            } else if (chars[i] == '(') {
                res = value(chars, i + 1);
                num = res[0];
                i = res[1];
            } else {
                addNum(deque, num);
                deque.offerLast(String.valueOf(chars[i]));
                num = 0;
            }
        }
        addNum(deque, num);
        return new int[]{getNum(deque), i};
    }

    public void addNum(Deque<String> deque, int num) {
        int pre = 0;
        if (!deque.isEmpty()) {
            String last = deque.pollLast();
            if (last.equals("+") || last.equals("-")) {
                deque.offerLast(last);
            } else {
                pre = Integer.valueOf(deque.pollLast());
                num = last.equals("*") ? pre * num : pre / num;
            }
        }
        deque.offerLast(String.valueOf(num));
    }

    public int getNum(Deque<String> deque) {
        int res = 0;
        int curNum = 0;
        boolean preSign = true;
        String fist = null;
        while (!deque.isEmpty()) {
            fist = deque.pollFirst();
            if (fist.equals("+") || fist.equals("-")) {
                preSign = fist.equals("+");
            } else {
                curNum = Integer.valueOf(fist);
                res = preSign ? res + curNum : res - curNum;
            }
        }
        return res;
    }

    //测试
    public static void main(String[] args) {
        Chapter5_15 chapter = new Chapter5_15();
        String str = "48*((70-65)-43)+8*1";
        int result = chapter.getValue(str);
        System.out.println("48*((70-65)-43)+8*1 结果:" + result);
    }
}

result

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=324935744&siteId=291194637