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

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. instance 怎么获得自己的 Metadata - 每天5分钟玩转 OpenStack(169)

    要想从 nova-api-metadata 获得 metadata,需要指定 instance 的 id.但 instance 刚启动时无法知道自己的 id,所以 http 请求中不会有 instan ...

  2. Python_入门

    本章内容: 1.Python的种类 2.Python的环境 3.Python入门(解释器.编码.pyc文件.脚步传入参数.变量.输入.流程控制与缩进.while循环) 4.练习题 Python的种类 ...

  3. jQuery控制input不可编辑

    1.开启disabled,是input不可以编辑 $("#id").attr("disabled","disabled"); 2.关闭dis ...

  4. 使用JDB调试Java程序

    Java程序中有逻辑错误,就需要使用JDB来进行调试了.调试程序在IDE中很方便了,比如这篇博客介绍了在Intellj IDEA中调试Java程序的方法. 我们课程内容推荐在Linux环境下学习,有同 ...

  5. 老李性能测试分享:可以没事代理刷榜赚外快了,poptest这是让你快速致富啊

    老李性能测试分享:可以没事代理刷榜赚外快了,poptest这是让你快速致富啊   最近学员不断面试,不时听到令人惊喜的消息,类似应届专科毕业生获得7k月薪,小美女应聘月薪11k等等,看到学员开心的笑容 ...

  6. PIC32MZ Live update bootloader

    PIC32MZ 的 flash memory 支持live update, 这是个全新的特性,在之前的所有PIC不管是8位还是16位的单片机上面都没有这个特性.我写过很多PIC 8位和16位单片机的b ...

  7. 细说OC中的load和initialize方法

    OC中有两个特殊的类方法,分别是load和initialize.本文总结一下这两个方法的区别于联系.使用场景和注意事项.Demo可以在我的Github上找到--load和initialize,如果觉得 ...

  8. Statistical Models and Social Science

    1.1 Statistical Models and Social Reality KEY: complex society v.s statistical models relationship,d ...

  9. java 基础知识九 类与对象

    java  基础知识九  类与对象 1.OO(Object–Oriented )面向对象,OO方法(Object-Oriented Method,面向对象方法,面向对象的方法)是一种把面向对象的思想应 ...

  10. CTF 字符统计1

    题目地址:http://sec.hdu.edu.cn/question/web/1047/ 题目如下: 给你2秒钟的时间,告诉我下面这坨字符中有多少个s,多少个e,多少个c,多少个l,多少个a和多少个 ...