import java.util.Scanner;
import java.util.Stack;
/**
*
* @author ccsu_wyw
* @see 表达式计算:注意输入操作数与操作符之间必须有间隔,如:4 + 2 * 3 - 10 / 5 =
*/
public class Cal {
public static void main(String[] args) {
Cal cal = new Cal();
while(true) {
double a = cal.Expression();
System.out.println(a);
}
}
/**
* 运算符优先级比较
* @param a
* @param b
* @return 返回值为1则第一个运算符优先级大,返回值为0则相等,否则第二个优先级大
*/
public int Precede(String a, String b) {
int flag = 1;
if(a.equals("+") && (b.equals("*")||b.equals("/")||b.equals("("))) {
flag = -1;
}else if(a.equals("-") && (b.equals("*")||b.equals("/")||b.equals("("))) {
flag = -1;
}else if(a.equals("*") && (b.equals("("))) {
flag = -1;
}else if(a.equals("/") && (b.equals("("))) {
flag = -1;
}else if(a.equals("(") && (b.equals(")"))) {
flag = 0;
}else if(a.equals("(")) {
flag = -1;
}else if(a.equals("=") && (b.equals("="))) {
flag = 0;
}else if(a.equals("=")) {
flag = -1;
}
return flag;
}
/**
* 判断是否为操作符
* @param a
* @return 判断是否为操作符,为真说明是操作符,否则为操作数
*/
public boolean In(String a) {
boolean flag = false;
String[] s = {"+", "-", "*", "/", "(", ")", "="};
for(int i=0; i<s.length; i++) {
if(a.equals(s[i])) {
flag = true;
break;
}
}
return flag;
}
/**
* 运算符计算
* @param a
* @param s
* @param b
* @return 返回计算结果
*/
public double Operate(double a, String s, double b) {
double result = 0;
if(s.equals("+")) result = a + b;
else if(s.equals("-")) result = a - b;
else if(s.equals("*")) result = a * b;
else result = a / b;
return result;
}
/**
* 表达式计算
* @return
*/
public double Expression() {
Stack<String> stack1 = new Stack<String>();
Stack<Double> stack2 = new Stack<Double>();
stack1.push("=");
Scanner cin = new Scanner(System.in);
String c = cin.next();
while((!c.equals("=")) || (!stack1.peek().equals("="))) {
if(!(In(c))) {
stack2.push(Double.parseDouble(c));
c = cin.next();
}else {
switch(Precede(stack1.peek(), c)) {
case -1:
stack1.push(c);
c = cin.next();
break;
case 0:
stack1.pop();
c = cin.next();
break;
case 1:
double num2 = stack2.pop();
double num1 = stack2.pop();
String optr = stack1.pop();
stack2.push(Operate(num1, optr, num2));
}
}
}
return stack2.peek();
}
}
友情推广:迷失逃脱运营系统