在 Java 中計算數學表示式

Zeeshan Afridi 2022年7月18日
在 Java 中計算數學表示式

使用堆疊評估數學表示式是最常見和有用的選項之一。

Stack 有兩種標準方法,pop()push(),用於從堆疊中放入和獲取運算元或運算子。pop() 方法刪除表示式的頂部元素,而 push() 方法將一個元素放在堆疊頂部。

在 Java 中計算數學表示式

這是一個用 Java 計算數學表示式的示例。此程式碼遵循正確的 DMAS 規則,具有以下優先順序:除法、乘法、加法和減法。

你可以給它任何數學表示式作為輸入,但要確保表示式僅包含以下四種運算(加法、乘法、除法和減法)。

示例程式碼:

package evaluateexpression;

import java.util.Scanner;
import java.util.Stack;

public class EvaluateExpression {

    public static void main(String[] args){

        Scanner scan = new Scanner(System.in);

        // Creating stacks for operators and operands
        Stack<Integer> operator  = new Stack();
        Stack<Double> value = new Stack();

        // Let's create some temparory stacks for operands and operators
        Stack<Integer> tmpOp  = new Stack ();
        Stack<Double> tmpVal = new Stack ();

        // Enter an arthematic expression
        System.out.println("Enter expression");
        String input = scan.next();
        System.out.println("The type of the expression is "+((Object)input).getClass().getSimpleName());
        input = "0" + input;
        input = input.replaceAll("-","+-");

        // In the respective stacks store the operators and operands
        String temp = "";
        for (int i = 0;i < input.length();i++){
            char ch = input.charAt(i);
            if (ch == '-')
                temp = "-" + temp;
            else if (ch != '+' &&  ch != '*' && ch != '/')
               temp = temp + ch;
            else{
                value.push(Double.parseDouble(temp));
                operator.push((int)ch);
                temp = "";
            }
        }
        value.push(Double.parseDouble(temp));

        // Create a character array for the operator precedence

        char operators[] = {'/','*','+'};

        /* Evaluation of expression */
        for (int i = 0; i < 3; i++){
            boolean it = false;
            while (!operator.isEmpty()){
                int optr = operator.pop();
                double v1 = value.pop();
                double v2 = value.pop();

                if (optr == operators[i]){
                    // if operator matches evaluate and store it in the temporary stack
                    if (i == 0){
                        tmpVal.push(v2 / v1);
                        it = true;
                        break;
                    }
                    else if (i == 1){
                        tmpVal.push(v2 * v1);
                        it = true;
                        break;
                    }
                    else if (i == 2){
                        tmpVal.push(v2 + v1);
                        it = true;
                        break;
                    }
                }
                else{
                    tmpVal.push(v1);
                    value.push(v2);
                    tmpOp.push(optr);
                }
            }
            // pop all the elements from temporary stacks to main stacks
            while (!tmpVal.isEmpty())
                value.push(tmpVal.pop());
            while (!tmpOp.isEmpty())
                operator.push(tmpOp.pop());
            // Iterate again for the same operator
            if (it)
                i--;
        }
        System.out.println("\nResult = "+value.pop());
    }
}

輸出:

Enter expression
2+7*5-3/2
The type of the expression is String

Result = 35.5

正如你在上述程式碼的輸出中看到的,表示式 2+7*5-3/2 作為輸入給出。程式計算結果為 35.5

它首先劃分 3/2 = 1.5,因為在 DMAS 規則中,劃分具有最高優先順序。然後乘法部分計算為 7*5 = 35

接下來,我們有 2+35 = 37 的加法,表示式的最後一部分是減法,即 37 -1.5 = 35.5

Zeeshan Afridi avatar Zeeshan Afridi avatar

Zeeshan is a detail oriented software engineer that helps companies and individuals make their lives and easier with software solutions.

LinkedIn

相關文章 - Java Math