zoukankan      html  css  js  c++  java
  • 《程序员代码面试指南》第五章 字符串问题 公式字符串求值

    题目

    公式字符串求值
    

    java代码

    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);
        }
    }
    
    

    结果

  • 相关阅读:
    【背包问题】
    【CodeVS1037】取数游戏
    【CodeVS2226】飞行棋
    网线主管
    第一周计划
    毕业设计每日总结2020/2/16
    毕业设计每日总结2020/2/15
    毕业设计每日总结2020/2/14
    毕业设计每日总结2020/2/13
    毕业设计每日总结2020/2/12
  • 原文地址:https://www.cnblogs.com/lizhouwei/p/8947619.html
Copyright © 2011-2022 走看看