zoukankan      html  css  js  c++  java
  • 中缀表达式到逆波兰表达式的转换及求值

        最近要写一个工资管理软件,不可避免的要用到公式的定义及求值等问题。对于数学表达式的计算,虽然也有直接对表达式进行扫描并按照优先级逐步计算的方法,但感觉还是不如将中缀表达式转换为逆波兰表达式更容易处理。
        使用逆波兰表达式,则有以下几件工作需要去做:
        1.对中缀表达式进行语法分析,或称合法性检查。
        2.将中缀表达式转换为逆波兰表达式。
        3.计算逆波兰表达得到我们想要的值。
    以下是我为实现该功能而写的一个简单的类:
    using System;
    using System.Text;
    using System.Collections;
    using System.Text.RegularExpressions;

    namespace Seaking
    {
        
    public class RpnExpression
        
    {
            
    检查中缀表达式的合法性数字
                string exMatch=@"^0([-+*/]0)*$";//匹配无括号的、用
    0替换所有的数字后的表达式
                
                exp
    =Regex.Replace(exp,numberMatch,"0");//为简化检测,用0替换所有的数字
                while(Regex.IsMatch(exp,pMatch))
                
    {
                    
    foreach(Match match in Regex.Matches(exp,pMatch))
                    
    {
                        
    string tmp=match.Value;
                        tmp
    =tmp.Substring(1,tmp.Length-2);//去掉 "("和 ")"
                        if(!Regex.IsMatch(tmp,exMatch)) return false;
                    }

                    exp
    =Regex.Replace(exp,pMatch,"0");//将最内层的括号及括号内表达式直接用一个0代替
                }


                
    return Regex.IsMatch(exp,exMatch);
            }

            
    #endregion

            
    生成逆波兰表达式

            
    计算逆波兰表达式的值
        }

    }

        由于只是工资计算,该类只支持+-×/ 四种运算,而且不支持负数(太麻烦,呵呵),有兴趣的朋友可以自己扩充一下。
  • 相关阅读:
    分布式全局ID生成器设计
    对volatile不具有原子性的理解
    理解单链表的反转(java实现)
    Spring Boot 自定义kafka 消费者配置 ContainerFactory最佳实践
    Java 重载方法的匹配规则-含有变长参数方法的匹配
    为什么会产生jar包冲突,如何排查jar包冲突?
    SpringBoot 整合mongoDB并自定义连接池
    Java使用Optional与Stream来取代if判空逻辑(JDK8以上)
    多级树的深度优先遍历与广度优先遍历(Java实现)
    Maven pom.xml 全配置(一)常用配置
  • 原文地址:https://www.cnblogs.com/chinadhf/p/452137.html
Copyright © 2011-2022 走看看