Java实现中序表达式

前序表达式的实现: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"));

    }

}

转载于:https://www.cnblogs.com/libin-blogs/p/9441231.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值