Java实现中序表达式

2018-08-10 11:14:22来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

前序表达式的实现:https://www.cnblogs.com/libin-blogs/p/9445163.html

后序表达式的实现:https://www.cnblogs.com/libin-blogs/p/9445716.html

该文时中序表达式的实现,下面将介绍中序表达式以及实现过程

 

中序表达式的概念:对于我们来说,类似(1+2)*3+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"));

    }

}

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:Struts2知识点小结(二)

下一篇:17mysql2█▓