若已知运算符之间的优先关系,可按如下步骤构造优先函数:

1、对每个运算符a(包括#在内)令f(a)=g(a)=1

2、如果a⋗b且f(a)<=g(b)令f(a)=g(b)+1

3、如果a⋖b且f(a)>=g(b)令g(b)= f(a)+1

4、如果a≐b而f(a) ≠g(b),令min{f(a),g(b)}=max{f(a),g(b)}

5、重复2~4,直到过程收敛。如果重复过程中有一个值大于2n,则表明不存在算符优先函数。

 import java.util.Scanner;

 /**
* Created by redli on 2017/5/2.
*
* 样例输入1
* --------------------------------------------------
请输入终结符(输入#号结束):
+*()i#
请输入关系矩阵(#号结束):
><<><>><><<<<+<>>!>!>>!>!#
-----------------------------------------------------
* 样例输入2
* --------------------------------------------------
请输入终结符(输入#号结束):
abcd#
请输入关系矩阵(#号结束):
!!>>!!>!<=<!=!=!#
-----------------------------------------------------
*/
public class Floyd {
public static Scanner in = new Scanner(System.in);
public static StringBuffer terminal = new StringBuffer();
public static StringBuffer matrix = new StringBuffer();
public static void main(String args[]){
//输入
Input input = new Input();
input.inputTerminal();
input.inputMatrix(); //优先函数
PriorityFunction priority_function = new PriorityFunction();
priority_function.makePriorityFunction();
priority_function.createPriorityFunction();
priority_function.outPriorityFunction();
} private static class Input{
//输入终结符
public void inputTerminal(){
System.out.println("请输入终结符(输入#号结束):");
String str = in.next();
while(!str.equals("#")){
if(str.substring(str.length()-1).equals("#")){
terminal.append(str.substring(0,str.length()-1));
str = "#";
} else{
terminal.append(str);
str = in.next();
}
}
} /*
* 输入关系矩阵
* 输入>,<,=,!(表示为空)
* */
public void inputMatrix(){
System.out.println("请输入关系矩阵(#号结束):");
String str = in.next();
while(!(str.equals("#"))){
if(!(str.substring(str.length()-1).equals("#"))){
matrix.append(str);
str = in.next();
} else{
matrix.append(str.substring(0,str.length()-1));
str = "#";
}
}
}
} /*
* 优先函数处理类
* */
private static class PriorityFunction{
int num = terminal.length();
int [][] arr = new int[2][num];
/*
* 构造优先函数,赋初值1
* */
public void makePriorityFunction(){
for(int i=0; i<2; i++){
for(int j=0;j<num;j++){
arr[i][j] = 1;
}
}
} /*
*
* 生成优先函数
*
* */
public void createPriorityFunction(){
int k=1;
int terLength = terminal.length();
while(k!=0){
k = 0;
for(int i=0; i<terminal.length();i++){
for(int j=0; j<terminal.length(); j++){
if(Character.toString(matrix.charAt(i*terLength+j)).equals(">") && arr[0][i]<=arr[1][j]){
arr[0][i]=arr[1][j]+1;
k=1;
} else if(Character.toString(matrix.charAt(i*terLength+j)).equals("<") && arr[0][i]>=arr[1][j]){
arr[1][j]=arr[0][i]+1;
k=1;
}
}
}
}
} /*
* 输出优先函数
* */
public void outPriorityFunction(){
for(int k=0; k<terminal.length(); k++){
System.out.print(terminal.charAt(k)+" ");
}
System.out.println();
for(int i=0; i<2; i++){
for(int j=0; j<terminal.length();j++){
System.out.print(arr[i][j]+" ");
}
System.out.print("\n");
}
}
}
}

根据优先关系矩阵使用逐次加一发构造优先函数(Java)的更多相关文章

  1. Tomcat的class加载的优先顺序

    Tomcat的class加载的优先顺序一览 1.最先是$JAVA_HOME/jre/lib/ext/下的jar文件. 2.环境变量CLASSPATH中的jar和class文件. 3.$CATALINA ...

  2. Springboot学习01- 配置文件加载优先顺序和本地配置加载

    Springboot学习01-配置文件加载优先顺序和本地配置加载 1-项目内部配置文件加载优先顺序 spring boot 启动会扫描以下位置的application.properties或者appl ...

  3. java8--类加载机制与反射(java疯狂讲义3复习笔记)

    本章重点介绍java.lang.reflect包下的接口和类 当程序使用某个类时,如果该类还没有被加载到内存中,那么系统会通过加载,连接,初始化三个步骤来对该类进行初始化. 类的加载时指将类的clas ...

  4. 【机器学习】梯度、Hessian矩阵、平面方程的法线以及函数导数的含义

    想必单独论及" 梯度.Hessian矩阵.平面方程的法线以及函数导数"等四个基本概念的时候,绝大部分人都能够很容易地谈个一二三,基本没有问题. 其实在应用的时候,这几个概念经常被混 ...

  5. 梯度、Hessian矩阵、平面方程的法线以及函数导数的含义

    本文转载自: Xianling Mao的专栏 =========================================================================== 想 ...

  6. php实现数字格式化,数字每三位加逗号的功能函数

    原地址:http://www.jb51.net/article/73781.htm php实现数字格式化,数字每三位加逗号的功能函数,具体代码如下: ? 1 2 3 4 5 6 7 8 9 10 11 ...

  7. Javascript兑现图片预加载【回调函数,多张图片】 (转载)

    Javascript实现图片预加载[回调函数,多张图片] 使用JS实现一组图片动画效果或者使用HTML5 Canvas渲染一系列图片等案例中,需要图片全部加载完成方可运行动画效果.此时程序中就会涉及多 ...

  8. javascript window.onload 加载多个函数的方法

    用法如下: function func(){alert("this is window onload event!");return;} window.onload=func; 或 ...

  9. HDU 4549 矩阵快速幂+快速幂+欧拉函数

    M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Sub ...

随机推荐

  1. Android中的Drawable和动画

    Android中Drawable是一种可以在Canvas上进行绘制抽象的概念,种类很多,常见的颜色和图片都可以是一个Drawable.Drawable有很多种,它们表示一种图像的概念,但是它们又不全是 ...

  2. Linux MTD子系统 _从模型分析到Flash驱动模板

    MTD(Memory Technology Device)即常说的Flash等使用存储芯片的存储设备,MTD子系统对应的是块设备驱动框架中的设备驱动层,可以说,MTD就是针对Flash设备设计的标准化 ...

  3. 学习了php之后再来看php怎样学java

    我用了一天时间学会了php,真的.我现在已经可以流畅的用thinkphp框架开发php了.学习过程是这样的:我接了个php的项目,包括两个部分:老系统添加功能和优化,再新做一个系统.已经答应给人家做了 ...

  4. raise RuntimeError("autoconf error") RuntimeError: autoconf error

    pip 安装模块时遇到下错误,没有粘贴全,差不多都是这样.这个情况是 pip 安装模块 需要 gcc 及 python-devle 支持, ubuntu 是 python-dev ,使用Yum 安装即 ...

  5. MYSQL优化_MYSQL分区技术[转载]

    MySQL分区技术是用来减轻海量数据带来的负担,解决数据库性能下降问题的一种方式,其他的方式还有建立索引,大表拆小表等等.MySQL分区按照分区的参考方式来分有RANGE分区.LIST分区.HASH分 ...

  6. Hadoop/Spark开发环境配置

    修改hostname bogon 为localhost 查看ip地址 [training@bogon ~]$ sudo hostname localhost [training@bogon ~]$ h ...

  7. 【Electron】Electron开发入门(八):自定义electron框架外壳(shell)的菜单(Menu)

    1.自定义electron框架外壳(shell)的菜单(Menu) electron的main.js里代码: const Menu = require('electron').Menu; var te ...

  8. Python之路-计算机基础

    一·计算机的组成 一套完整的计算机系统分为:计算机硬件,操作系统,软件.   硬件系统:运算器,控制器和存储器 ,输入设备,输出设备. 1.运算器:负责算数运算和逻辑运算,与控制器一起组成CPU. 2 ...

  9. PHP中的for循环

    循环 循环是操作某一个功能(执行某段代码). ①循环四要素: a 循环初始值 b 循环的条件 c 循环状态 d 循环体 ②for循环 a 穷举:把所有的可能性的都一一列出来. b 迭代:每次循环都会把 ...

  10. SpringMVC 自定义全局日期转换器

    第一步: 编写自定义转换器的类 /* * 自定义日期转换器 */ public class CustomDateConverter implements Converter<String, Da ...