算法 计算四则运算字符串结果

Posted lvjianwei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法 计算四则运算字符串结果相关的知识,希望对你有一定的参考价值。

RingBuffer面试后面一场,输入一个字符串,计算结果

字符串内容限制为“ 0-9,+,-,*,/”这些符号

例如输入"1+2*3/4-5",返回-2.5。

 

开始到时候直接想到了可以用树来维护计算关系,后来被问可以用其他数据结构么,然后想到应该用栈来实现,写的时候用了一个,写到后面突然意识到应该用两个栈,一个存数据,一个存操作符。

在家里写了完成大概写了一个小时不到,当时是没写完,后来口述了一下逻辑。

重点在于:

1.第一个符号到判断,可能第一个字符是“+”或者“-”。

2.末尾非法符号判断。

3.中间连续连个操作符的判断。

具体是几行粗体代码

 

package com.ljw.javatest;

import java.util.LinkedList;
import java.util.Stack;

public class Calculate 

    public static void print(Object value) 
        System.out.println(value);
    

    public static void main(String[] args) throws Exception 
        String input = null;

        input = "1+2*3/4-5";
        print(calculate(input) == -2.5);

        input = "-1+2*3/4-5";
        print(calculate(input) == -4.5);

        try 
            input = "";
            calculate(input);
         catch (Exception ex) 
            print(ex.getMessage().equals(exMsg));
        

        try 
            input = null;
            calculate(input);
         catch (Exception ex) 
            print(ex.getMessage().equals(exMsg));
        

        try 
            input = "1+2*3/4-a5";
            calculate(input);
         catch (Exception ex) 
            print(ex.getMessage().equals(exMsg));
        

        try 
            input = "1+2*a3/4-5";
            calculate(input);
         catch (Exception ex) 
            print(ex.getMessage().equals(exMsg));
        

        try 
            input = "1+2**3/4-5";
            calculate(input);
         catch (Exception ex) 
            print(ex.getMessage().equals(exMsg));
        

        try 
            input = "1+2*3/4+-5";
            calculate(input);
         catch (Exception ex) 
            print(ex.getMessage().equals(exMsg));
        

        try 
            input = "1+-2*3/4-5";
            calculate(input);
         catch (Exception ex) 
            print(ex.getMessage().equals(exMsg));
        

        
        try 
            input = "1-2*3/4-5-";
            calculate(input);
         catch (Exception ex) 
            print(ex.getMessage().equals(exMsg));
        

    

    static String exMsg = "invalid input";

    public static double calculate(String input) throws Exception 
        if (input == null || input.length() == 0) 
            throw new Exception(exMsg);
        

        char[] arr = input.toCharArray();
        Stack<Double> valueStack = new Stack();
        Stack<String> opStack = new Stack();

        StringBuilder sb = new StringBuilder();
        boolean flag = false;
        for (int i = 0; i < arr.length; i++) 
            char temp = arr[i];
            if (temp != ‘+‘ && temp != ‘-‘ && temp != ‘*‘ && temp != ‘/‘) 
                if (temp < ‘0‘ || temp > ‘9‘) 
                    throw new Exception(exMsg);
                
                sb.append(temp);

                continue;
            
            Double value = null;
            if (sb.length() != 0) 
                value = Double.parseDouble(sb.toString());
                sb.setLength(0);
            

            if(i<arr.length-1
                &&!(arr[i+1] != ‘+‘ && arr[i+1] != ‘-‘ && arr[i+1] != ‘*‘ && arr[i+1] != ‘/‘))
                throw new Exception(exMsg);
            
            if(i==arr.length-1)
                throw new Exception(exMsg);
            

            if (flag) 
                if (value == null) 
                    throw new Exception(exMsg);
                
                Double a = valueStack.pop();
                String op = opStack.pop();
                switch (op) 
                case "*":
                    value = a * value;
                    break;
                case "/":
                    value = a / value;
                    break;
                // default:
                //     throw new Exception(exMsg);
                
                valueStack.push(value);
             else 
                if (value != null) 
                    valueStack.push(value);
                
            

            opStack.push(String.valueOf(temp));
            if (temp == ‘+‘ || temp == ‘-‘) 
                flag = false;
             else 
                flag = true;
            
        
        // if (sb.length() == 0) 
        //     throw new Exception(exMsg);
        // 
        valueStack.push(Double.parseDouble(sb.toString()));

        double result = valueStack.pop();

        while (!valueStack.isEmpty() && !opStack.isEmpty()) 
            double value = valueStack.pop();
            String op = opStack.pop();
            // 第一个输入可能是带符号
            if (valueStack.isEmpty() && opStack.size() == 1) 
                String extra = opStack.pop();
                if (extra.equals("-")) 
                    value = 0 - value;
                
            
            switch (op) 
            case "-":
                result = value - result;
                break;
            case "+":
                result = value + result;
                break;
            // default:
            //     throw new Exception(exMsg);
            

        

        // if (!valueStack.isEmpty() || !opStack.isEmpty()) 
        //     throw new Exception(exMsg);
        // 

        return result;
    

 

以上是关于算法 计算四则运算字符串结果的主要内容,如果未能解决你的问题,请参考以下文章

算法提高 6-17复数四则运算

蓝桥杯 算法提高 6-17复数四则运算

数据结构与算法之深入解析“分数加减运算”的求解思路与算法示例

算法笔记_156:算法提高 6-17复数四则运算(Java)

PHP 中如何进行 长16进制的字符串运算?

每周一道算法题002:四则运算