package stact;
import java.util.Scanner;
public class EvaluateException {
/*
* 運算符
* 比較兩個運算符的優先級
* */
private static String compare(String first, String second) {
if (first.equals("+") || first.equals("-")) {
if (second.equals("=") || second.equals("+") || second.equals("-") || second.equals(")")) {
return ">";
} else if (second.equals("*") || second.equals("/") || second.equals("(")) {
return "<";
}
} else if (first.equals("*") || first.equals("/")) {
if (second.equals("=") || second.equals("+") || second.equals("-") || second.equals("*") || second.equals("/") || second.equals(")")) {
return ">";
} else if (second.equals("(")) {
return "<";
}
} else if (first.equals("(")) {
if (second.equals("+") || second.equals("-") || second.equals("*") || second.equals("/") || second.equals("(")) {
return "<";
} else if (second.equals(")")) {
return ">";
}
}
return null;
}
/*
* 計算表達式的值
* */
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String exp = sc.nextLine();
Stact<Double> num = new Stact<>(); //數據棧
Stact<String> ch = new Stact<>(); //運算符棧 符號只包括“+、-、*、/、(、)、=”英文符號
//暫時假設所有各項之間用空格分開已經,例如:1 + 2 + ( 4 - 2 ) =
String []items = exp.split(" ");
for ( int i = 0; i < items.length; i ++) {
String item = items[i];
try {
double n = Double.parseDouble(item);
//是數字
num.push(n);
} catch (NumberFormatException e) {
//不是數字
if (ch.base == ch.top) {
//棧爲空
ch.push(item);
} else {
switch (compare(ch.top(),item)) {
case ">": {
//如果棧頂的元素優先級高
switch (ch.pop()) {
case "+": num.push(num.pop() + num.pop());i --;
break;
case "-": {
//棧頂元素做減數
double a = num.pop();
double b = num.pop();
num.push(b - a);
i --;
}
break;
case "*": num.push(num.pop() * num.pop());i --;
break;
case "/":{
//棧頂元素做除數
double a = num.pop();
double b = num.pop();
num.push(b / a);
i --;
}
break;
case "(": break;
}
break;
}
case "<": {
ch.push(item);
}
}
}
}
}
System.out.println(exp + " " +num.top());
}
static class Stact<E> {
int base;
int top;
Object []notes = new Object[10000];
public Stact() {
this.top = 0;
this.base = 0;
}
/*
* 刪除棧頂元素並返回
* */
public E pop() {
return (E)notes[-- top];
}
/*
* top獲取棧頂元素
* */
public E top() {
return (E)notes[top - 1];
}
/*
* 向棧中添加一個元素
* */
public void push(E e) {
notes[top ++] = e;
}
}
}
表達式求解——Java
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.