1. 程式人生 > 其它 >實現簡單的算術表示式

實現簡單的算術表示式

這裡用棧的資料結構實現算術表示式(簡單起見,這裡定義的是未省略括號的算術表示式,支援+、-、*、/)。 E.W.Dijkstra在20世紀60年代發明了一個簡單演算法,用兩個棧(一個用於儲存運算子,一個用於儲存運算元)完成了這個任務。表示式由括號、運算子和運算元組成,根據以下4種情況從左到右逐個將這些實體送入棧處理: 1.將運算元壓入運算元棧; 2.將運算子壓入運算子棧; 3.忽略左括號; 4.在遇到右括號時,彈出一個運算子,彈出所需數量的運算元,並將運算子和運算元的運算結果壓入運算元棧。 在處理完最後一個右括號之後,運算元棧上只會有一個值,即表示式的值。 java實現程式碼如下:

import java.util.Scanner;

import java.util.Stack;

public class Evaluate {
public static double evalute(String str){
Stack ops = new Stack();//運算元棧
Stack vals = new Stack();//操作符棧

    for(int i = 0; i < str.length(); i++){
        char c = str.charAt(i);
        //讀取字元,如果是運算子則壓入運算子棧
        if(c == '(' || c == ' '){//忽略左括號
        }else if(c == '+' || c == '-' || c == '*' || c == '/'){
            ops.push(c);
        }else if(c == ')'){
            //如果字元為')',彈出運算子和運算元,計算結果並壓入棧
            char op = ops.pop();
            double v = vals.pop();
            if(op == '+'){
                v += vals.pop();
            }else if(op == '-'){
                v -= vals.pop();
            }else if(op == '*'){
                v *= vals.pop();
            }else if(op == '/'){
                v /= vals.pop();
            }
            vals.push(v);
        }else{//如果字元不是括號,不是運算子,也不是空格,則作為double值壓入運算元棧
            vals.push((double)(c - '0'));
        }
    }
    return vals.pop();
}

public static void main(String[] args){
    //輸入的運算元只能是一位數
    System.out.println("請輸入表示式:");
    Scanner in = new Scanner(System.in);
    String str = in.nextLine();

    System.out.println(str + "=" + evalute(str));
}

}


執行結果:

這裡寫圖片描述
提示:
在這裡插入圖片描述