java表达式求值

表达式求值

实验11:整数算术表达式分析程序
题目类别: B作业

关键字: 类、对象、封装、类之间的关系、字符串

内容要求:

  1. 编写一个Java应用程序。

  2. 要求实现功能如下:

(1) 从键盘输入一个表示整数四则运算的字符串,例如:32+5*2-40/3

四则运算符号:

+代表整数加法、-代表整数减法、*代表整数乘法、/代表整数除法(结果为整数)

运算数全部为正整数

表达式中没有括号

假设输入的字符串一定是符合上面规则的整数四则运算的表达式。

运算数和运算符号之间可能有个数不定(0个或多个)的空格。

(2) 程序按照四则运算符的优先级和结合性对表达式进行分析并产生输出结果。

  1. 运行示例:

输入:32+5*2-40/3

输出:29

本次实验比较困扰我的有两个地方,1.如何将数字与运算符分隔开,2.中缀表达式的运算;


package ddd;
import java.util.Scanner;
import java.util.Stack;

public class calculation {
     

	public static void main(String[] args) {
     
		// TODO Auto-generated method stub
		Scanner input = new Scanner(System.in);
		System.out.println("请输入一个算术表达式: ");
		String s = input.nextLine();//因为输入有空格,所以用nextline
		String[] ss = s.split("\\b");//将数字和运算符分隔开
		
		/*去掉每个字符串中的空格,但是replace并不会替代掉原来的内容
		  所以得赋值给自身
		*/
		for(int i=0;i<ss.length;i++) {
     
			ss[i]=ss[i].replace(" ", "");
		}
		
		/*
		分别用两个栈存放数字和运算符
		用for-each检查每个字符串
		当该字符串为数字时,直接进数字栈
		当该字符串为运算符时:
			判断运算符栈里有无运算符,若无则进栈。
		    若有运算符则判断两个运算符的优先级大小
		    	如果当前运算符优先级>栈顶的运算符优先级,进栈
		    	如果当前运算符优先级<栈顶的运算符优先级,取出数字栈里的两个字符串进行计算。
		*/
		
		Stack<Integer> number = new Stack<>();
		Stack<String> fuhao = new Stack<>();
		
		for(String sc : ss ) {
     
		   if(isOperator(sc)) {
     
			  int currOperLevel = judge(sc);//记录当前优先级;
			  while(true) {
     
				  int stackOperLevel = 0;
			  if(fuhao.isEmpty() == false) {
     
				  String dd = fuhao.peek();
				  stackOperLevel = judge(dd);
			  }
			  else {
     
				  fuhao.push(sc);
				  break;
			  }
			  if(currOperLevel > stackOperLevel) {
     
				  fuhao.push(sc);
				  break;
			  }
			  else {
     
				  String Optemp = "0";
				  int num1 = 0;
				  int num2 = 0;
				  if(fuhao.isEmpty() == false) {
     
					  Optemp = fuhao.pop();
				  }
				  if(number.isEmpty() == false) {
     
					  num1 = number.pop();
					  num2 = number.pop();
					  
				  }
				  number.push(calculate(Optemp,num1,num2));
			  }
		   }
		  }
		   else {
     
			   int number1 = Integer.valueOf(sc);
			   number.push(number1);
		   }
		}
		
		//检查符号栈是否为空
		while(true) {
     
			if(fuhao.isEmpty() == false) {
     	
		          String temp = "0";
		          temp = fuhao.pop();  
				  int num1 = 0;
				  int num2 = 0;
				  if(number.isEmpty() == false) {
     
					  num1 = number.pop();
					  num2 = number.pop();
					  
				  }
				  number.push(calculate(temp,num1,num2));
			}
			else
				break;
			
		}
		System.out.println("结果为:"+number.pop());
		input.close();
	
	}
	
	public static boolean youxj(String a,String b) {
     
		 int first = judge(a);
		 int second = judge(b);
		 if(first > second)
			 return true;
		 else 
			 return false;
	 }
	 
	 public static int judge(String o) {
     
		 int a = 0;
		 switch(o) {
     
		 case "+": {
     
			 a = 0;
			 break;
		 }
		 case "-": {
     
			 a = 0;
			 break;
			 }
		 case "*": {
     
			 a = 1;
			 break;
			 }
		 case "/": {
     
			 a = 1;
			 break;
			 }
		 }
		return a;
	 }
	 
	 public static int calculate(String c,int a,int b) {
     
		 int sum = 0;
		 switch(c) {
     
		 case "+":{
     
			 sum = a+b;
			 break;
		 }
		 case "-":{
     
			 sum = b-a;
			 break;
		 }
		 case "*":{
     
			 sum = a*b;
			 break;
		 }
		 case "/":{
     
			 sum = b/a;
			 break;
		 }
		 }
		 return sum;
	 }
	 
	 public static boolean isOperator(String s) {
     
		// 这里有一个需要注意的地方,就是字符串是传引用,不能直接做比较,
		// 应该用eauals()表示内容是否相同,  若为s=="+",则表示对象相同。
		 if(s.equals("+")||s.equals("-")||s.equals("*")||s.equals("/"))
		     return true;
		 else
			 return false;
	 }
}

你可能感兴趣的:(java,java,表达式运算,无括号)