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