表达式求值

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();
 }
}

友情推广:迷失逃脱运营系统

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值