将expressionToken转化为逆波兰式,

其中逆波兰式与计算机中函数调用栈吻合

具体可参考百度百科文章逆波兰式

其中问题:为什么需要将IK中element转化为ExpressionToken?

/*** 两个栈,* 一个普通栈,用于存储逆波兰式,* 一个是操作符栈,用于存储操作符,并根据操作符的优先级,进行不同的处理* 算法可参考栈部分* 当前操作符的优先级 > 栈顶操作符的优先级,则继续压栈* 当前操作符的优先级 <= 栈顶操作符的优先级,则pop出来,加入到普通栈中,形成逆波兰式* 如果是括号,怎么处理,* 先处理括号,切括号的优先级最低*/public Deque<ExpressionToken> transferRPN(List<ExpressionToken> list){Deque<ExpressionToken> stack = new ArrayDeque<>();Deque<ExpressionToken> opStack = new ArrayDeque<>();List<ExpressionToken> tokenList = createTokeList();for (ExpressionToken token : tokenList){if (token.getTokenType() == ExpressionToken.ETokenType.ETOKEN_TYPE_CONSTANT){stack.push(token);} else {if (token.getTokenText().equals("(")){opStack.push(token);} else if (token.getTokenText().equals(")")){while (!opStack.isEmpty() && !opStack.peek().getTokenText().equals("(")){stack.push(opStack.pop());}if (opStack.peek().getTokenText().equals("(")){opStack.pop();} else {throw new RuntimeException("error");}} else {if (opStack.isEmpty() ||Operator.getOperator(token.getTokenText()).getPriority() > Operator.getOperator(opStack.peek().getTokenText()).getPriority()){opStack.push(token);} else {while (!opStack.isEmpty() && !opStack.peek().getTokenText().equals("(") && !opStack.peek().getTokenText().equals(")")&& Operator.getOperator(token.getTokenText()).getPriority() <= Operator.getOperator(opStack.peek().getTokenText()).getPriority()){stack.push(opStack.pop());}opStack.push(token);}}}}while (!opStack.isEmpty()){stack.push(opStack.pop());}return stack;}
public List<ExpressionToken> createTokeList(){//10 > 20 || 30 < 50 && (70 > 80 || 90 > 70)ExpressionToken token = new ExpressionToken();token.setTokenType(ExpressionToken.ETokenType.ETOKEN_TYPE_CONSTANT);token.setTokenText("10");token.setStartPosition(1);ExpressionToken token1 = new ExpressionToken();token1.setTokenType(ExpressionToken.ETokenType.ETOKEN_TYPE_OPERATOR);token1.setTokenText(">");token1.setStartPosition(4);ExpressionToken token2 = new ExpressionToken();token2.setTokenType(ExpressionToken.ETokenType.ETOKEN_TYPE_CONSTANT);token2.setTokenText("20");token2.setStartPosition(6);ExpressionToken token3 = new ExpressionToken();token3.setTokenType(ExpressionToken.ETokenType.ETOKEN_TYPE_OPERATOR);token3.setTokenText("||");token3.setStartPosition(9);ExpressionToken token4 = new ExpressionToken();token4.setTokenType(ExpressionToken.ETokenType.ETOKEN_TYPE_CONSTANT);token4.setTokenText("30");token4.setStartPosition(11);ExpressionToken token5 = new ExpressionToken();token5.setTokenType(ExpressionToken.ETokenType.ETOKEN_TYPE_OPERATOR);token5.setTokenText("<");token5.setStartPosition(1);ExpressionToken token6 = new ExpressionToken();token6.setTokenType(ExpressionToken.ETokenType.ETOKEN_TYPE_CONSTANT);token6.setTokenText("50");token6.setStartPosition(1);ExpressionToken token7 = new ExpressionToken();token7.setTokenType(ExpressionToken.ETokenType.ETOKEN_TYPE_OPERATOR);token7.setTokenText("&&");token7.setStartPosition(1);ExpressionToken token8 = new ExpressionToken();token8.setTokenType(ExpressionToken.ETokenType.ETOKEN_TYPE_OPERATOR);token8.setTokenText("(");token8.setStartPosition(1);ExpressionToken token9 = new ExpressionToken();token9.setTokenType(ExpressionToken.ETokenType.ETOKEN_TYPE_CONSTANT);token9.setTokenText("70");token9.setStartPosition(1);ExpressionToken token10 = new ExpressionToken();token10.setTokenType(ExpressionToken.ETokenType.ETOKEN_TYPE_OPERATOR);token10.setTokenText(">");token10.setStartPosition(1);ExpressionToken token11 = new ExpressionToken();token11.setTokenType(ExpressionToken.ETokenType.ETOKEN_TYPE_CONSTANT);token11.setTokenText("80");token11.setStartPosition(1);ExpressionToken token12 = new ExpressionToken();token12.setTokenType(ExpressionToken.ETokenType.ETOKEN_TYPE_OPERATOR);token12.setTokenText("||");token12.setStartPosition(1);ExpressionToken token13 = new ExpressionToken();token13.setTokenType(ExpressionToken.ETokenType.ETOKEN_TYPE_CONSTANT);token13.setTokenText("90");token13.setStartPosition(1);ExpressionToken token14 = new ExpressionToken();token14.setTokenType(ExpressionToken.ETokenType.ETOKEN_TYPE_OPERATOR);token14.setTokenText(">");token14.setStartPosition(1);ExpressionToken token15 = new ExpressionToken();token15.setTokenType(ExpressionToken.ETokenType.ETOKEN_TYPE_CONSTANT);token15.setTokenText("70");token15.setStartPosition(1);ExpressionToken token16 = new ExpressionToken();token16.setTokenType(ExpressionToken.ETokenType.ETOKEN_TYPE_OPERATOR);token16.setTokenText(")");token16.setStartPosition(1);List<ExpressionToken> list = new ArrayList<>();list.add(token);list.add(token1);list.add(token2);list.add(token3);list.add(token4);list.add(token5);list.add(token6);list.add(token7);list.add(token8);list.add(token9);list.add(token10);list.add(token11);list.add(token12);list.add(token13);list.add(token14);list.add(token15);list.add(token16);return list;}

/*** 表达式解析词元对象* @author 林良益,卓诗垚* @version 2.0 * 2008-09-18*/
public class ExpressionToken {//词元的语法类型public enum ETokenType{//常量ETOKEN_TYPE_CONSTANT ,//变量ETOKEN_TYPE_VARIABLE ,  //操作符ETOKEN_TYPE_OPERATOR ,//函数ETOKEN_TYPE_FUNCTION ,
//      //分隔符
//      ETOKEN_TYPE_SPLITOR ,;}//Token的词元类型:常量,变量,操作符,函数,分割符private ETokenType tokenType ;//存储字符描述private String tokenText ;//词元在表达式中的起始位置private int startPosition = -1;public ETokenType getTokenType() {return tokenType;}public void setTokenType(ETokenType tokenType) {this.tokenType = tokenType;}public String getTokenText() {return tokenText;}public void setTokenText(String tokenText) {this.tokenText = tokenText;}public int getStartPosition() {return startPosition;}public void setStartPosition(int startPosition) {this.startPosition = startPosition;}@Overridepublic String toString(){return tokenText;}
}
    public static void main(String[] args) throws IOException {
//        LevelReader lr = new LevelReader("  10 > 20 || 30 < 50 && (70 > 80 || 90 > 70)");
//        lr.readToken();LevelReader lr = new LevelReader(" ");List<ExpressionToken> tokeList = lr.createTokeList();Deque<ExpressionToken> expressionTokens = lr.transferRPN(tokeList);System.out.println(new Gson().toJson(expressionTokens));}

IKexpression解读二相关推荐

  1. 论文解读二十七:文本行识别模型的再思考

    摘要:本文研究了两个解码器(CTC[1]和 Transformer[2])和三个编码器模块(双向LSTM[3].Self-Attention[4]和GRCL[5]),通过大量实验在广泛使用的场景和手写 ...

  2. Paper:自动驾驶领域SAE标准之《道路机动车辆驾驶自动化系统相关术语的分类和定义》官方英文原文翻译与解读(二)

    Paper:自动驾驶领域SAE标准之<道路机动车辆驾驶自动化系统相关术语的分类和定义>官方英文原文翻译与解读(二) 目录 自动驾驶领域SAE标准之<道路机动车辆驾驶自动化系统相关术语 ...

  3. JStorm/Storm源码解读(二)--启动篇

    为了在解读分析时有个统一的思路,本文将从启动一个集群开始分析. (说明:为了测试方便,采用的是本地模式). 1.参数设置 Config conf = new Config(); //设置Topolog ...

  4. 劳动合同法解读二十:试用期工资

    对于要入职的兄弟们可以看看,了解了解: 第二十条 劳动者在试用期的工资不得低于本单位同岗位最低档工资或者劳动合同约定工资的百分之八十,并不得低于用人单位所在地的最低工资标准. [解读]本条是关于试用期 ...

  5. 北信科计算机系校区,北信科2016高招政策解读 二本可转一本

    <教育面对面>--2016北京高招直播咨邀请到北京信息科技大学的招生老师为大家权威解读招生政策! 今年在北京的招生计划总数是1515人,比去年增加了11人.理科在北京一本.二本都有招生,文 ...

  6. 【mmdetection源码解读(二)】RPN网络

    以下仅为个人理解,若有不正之处还请指出,欢迎交流! 在two-stage目标检测方法中,通过骨干网络获得的特征图需要送进RPN网络产生区域建议候选框,下面就结合mmdetection中的源码详细解释这 ...

  7. redis源码解读二

    上一篇解读了一下SDS,本来觉得完了,但之后想想感觉少点什么,现在我们从使用的角度去梳理一下,大家想想对于字符串, 我们经常使用的有哪几个方法呢?这些方法又是怎么实现的? 在研究上面的几个方法之前我们 ...

  8. 白话详细解读(二)-----AlexNet

    一.AlexNet简介 2012年,Alex Krizhevsky可以算作是LeNet的一个更深和更广的版本,可以用来学习更加复杂的对象. Alex的要点 1.用ReLU得到非线性,用ReLU非线性函 ...

  9. cJONS序列化工具解读二(数据解析)

    cJSON数据解析 关于数据解析部分,其实这个解析就是个自动机,通过递归或者解析栈进行实现数据的解析 /* Utility to jump whitespace and cr/lf *///用于跳过a ...

  10. ECharts 源码解读 二

    2021SC@SDUSC 源码结构和打包 源码使用webpack打包,查看文件webpack.config.js可知,将echarts源码编译成三个版本,分别为常用版本,精简版本,完整版本,分别对应w ...

最新文章

  1. R语言相关性计算及使用ggcorrplot包相关性分析热力图可视化分析实战
  2. 苹果iPad视觉设计分析
  3. mysql 硬盘空间不够_mysql磁盘空间不足的查排
  4. 在构造函数/析构函数中调用virtual函数带来的影响
  5. python怎么开发软件_怎么使用python进行软件开发
  6. 微软设计套装 Expression Studio 4 (Ultimate+Web Pro+Encoder Pro) 最新版下载
  7. UIMenuController,UIPasteboard:复制,粘贴详细解释
  8. 关于python搜题的软件哪个好_搜题用哪个软件好?
  9. C语言经典问题11-牛顿法求一个数的平方根函数
  10. 小程序亚马逊服务器,亚马逊aws服务器搭建实现微信小程序换脸(草草收尾)
  11. 17岁和27岁的自己
  12. 配置JMC远程监控linux上的java程序
  13. 大学计算机作业互评评语简短,大学生互评评语简短
  14. 【AI每日播报】首次超越LSTM : Facebook 门卷积网络新模型能否取代递归模型
  15. Adblock Plus使用教程
  16. matlab的polyfit,polyval,lsqcurvefit拟合函数
  17. 如何搭建vue脚手架
  18. matplotlib三维画图之观察博弈论混合策略下纳什均衡点
  19. LaTex 插入表格与图片
  20. jsp和html的区别以及jsp是如何实现动态的

热门文章

  1. matlab spams工具箱,matlab---SPAMS稀疏建模工具箱
  2. 简体字转换繁体字的winfrom小程序
  3. 不做律师,玩起了电子合同,这家入选微软加速器第十期的电子合同企业究竟是什么来头?
  4. android开发面试问题,这个回答让我错失offer!好文推荐
  5. windows和linux系统下数据传输工具——tftpd32使用说明
  6. Vulkan_Ray Tracing 03_加速结构
  7. iosSelect插件 H5中实现iOS的select下拉联动效果
  8. 舒缓肩颈酸痛,温暖呵护颈椎,宾多康智能颈椎按摩仪体验
  9. WESHOP | 基于微服务的小程序商城系统
  10. 转一篇帖子-我是如何在网上卖鱼的