Java实现中序表达式
程序员文章站
2022-05-18 23:24:17
Java实现中序表达式求值 中序表达式的概念:对于我们来说,类似(1+2)*3这样的式子,有算术优先级,需要考虑括号等,符合人的计算思维的式子叫做中序表达式。 缺点:计算机运算时不能考虑到优先级问题,只能依次扫描计算。 中序表达式实现步骤: 1、将表达式转成字符数组 2、依次取出字符数组,若该字符为 ......
Java实现中序表达式求值
中序表达式的概念:对于我们来说,类似(1+2)*3这样的式子,有算术优先级,需要考虑括号等,符合人的计算思维的式子叫做中序表达式。
缺点:计算机运算时不能考虑到优先级问题,只能依次扫描计算。
中序表达式实现步骤:
1、将表达式转成字符数组
2、依次取出字符数组,若该字符为数字,则入num栈(存数字),
若该字符为左括号,入ops栈(存算术符号和括号),
若该字符为运算符,判断栈是否为空,
当栈为空时,入ops栈,
当栈不为空时,
若字符为+或-,且栈顶字符为*或/,ops栈栈顶元素出栈,num出栈2个元素,与ops出栈元素做运算,直至栈顶元素为( 或 + 或 - ,字符入栈。
若字符为右括号,则ops栈一直出栈做运算,直至遇到左括号。
3、ops栈不为空时,依次出栈和num栈元素做运算,直至ops栈为空
4、取出num栈的唯一元素,即为表达式结果。
PS:原创,如有错误,请指出,感谢指教!
实现类:
1 package 表达式求值; 2 3 import java.util.Stack; 4 5 /* 6 * 中序表达式求值实现 7 */ 8 public class CenterExpression { 9 10 public double evaluate(String expression){ //传入中序表达式 11 char [] ex = expression.toCharArray(); 12 Stack<Double> num = new Stack<>(); 13 Stack<Character> ops = new Stack<>(); 14 for(int i = 0; i < ex.length; i++){ //循环将表达式依次入栈 15 char c = ex[i]; 16 if(c < '9' && c > '0'){ 17 num.push(Double.parseDouble(Character.toString(c))); 18 } 19 else if(c == '('){ 20 ops.push('('); 21 } 22 else if(c == ')'){ 23 while(true){ 24 char op = ops.pop(); 25 if(op == '('){ 26 break; 27 } 28 else{ 29 switch(op){ 30 case '+':num.push(num.pop()+num.pop());break; 31 case '-':num.push(num.pop()-num.pop());break; 32 case '*':num.push(num.pop()*num.pop());break; 33 case '/':num.push(num.pop()/num.pop());break; 34 default:break; 35 } 36 } 37 } 38 } 39 else if((c == '+' || c == '-' || c == '*' || c == '/') && ops.empty()){ 40 ops.push(c); 41 } 42 else if((c == '+' || c == '-' || c == '*' || c == '/') && !ops.isEmpty()){ 43 char op =ops.peek(); 44 while((op == '*' || op == '/') && (c == '+' || c == '-')){ 45 op = ops.pop(); 46 switch(op){ 47 case '+':num.push(num.pop()+num.pop());break; 48 case '-':num.push(num.pop()-num.pop());break; 49 case '*':num.push(num.pop()*num.pop());break; 50 case '/':num.push(num.pop()/num.pop());break; 51 default:break; 52 } 53 if(ops.isEmpty()){ 54 break; 55 } 56 else{ 57 op = ops.peek(); 58 } 59 } 60 ops.push(c); 61 } 62 } 63 while(!ops.isEmpty()){ //处理剩余可以按计算机扫描顺序处理的表达式 64 char op =ops.pop(); 65 switch(op){ 66 case '+':num.push(num.pop()+num.pop());break; 67 case '-':num.push(num.pop()-num.pop());break; 68 case '*':num.push(num.pop()*num.pop());break; 69 case '/':num.push(num.pop()/num.pop());break; 70 default:break; 71 } 72 } 73 return num.pop(); 74 } 75 76 public static void main(String [] args){ 77 CenterExpression exp = new CenterExpression(); 78 System.out.println(exp.evaluate("1*2+5*3")); 79 } 80 }
测试类:
package 表达式求值;
public class My_Test{
public static void main(String [] args){
CenterExpression exp = new CenterExpression();
System.out.println(exp.evaluate("1*2+5*3"));
}
}