欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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"));

    }

}