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

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. EF批量插入(转)

    原作者地址http://blog.csdn.net/zlts000/article/details/46385773 之前做项目的时候,做出来的系统的性能不太好,在框架中使用了EntityFramew ...

  2. iOS开发之UIApplication和delegate

    1.概述 所有的移动操作系统都有个致命的缺点:app很容易受到打扰.比如一个来电或者锁屏会导致app进入后台甚至被终止. 还有很多其它类似的情况会导致app受到干扰,在app受到干扰时,会产生一些系统 ...

  3. python 、mmap 实现内存数据共享

    import mmap mmap_file = None ##从内存中读取信息, def read_mmap_info(): global mmap_file mmap_file.seek(0) ## ...

  4. response.getWriter().write()与out.print()的区别(转)

    1.首先介绍write()和print()方法的区别:  (1).write():仅支持输出字符类型数据,字符.字符数组.字符串等  (2).print():可以将各种类型(包括Object)的数据通 ...

  5. 20155205 2016-2017-2 《Java程序设计》第4周学习总结

    20155205 2016-2017-2 <Java程序设计>第4周学习总结 教材学习内容总结 第六章 private成员会被继承,只不过子类无法直接存取,必须通过父类提供的方法来存取(若 ...

  6. 老李推荐:第8章7节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-小结

    老李推荐:第8章7节<MonkeyRunner源码剖析>MonkeyRunner启动运行过程-小结   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性 ...

  7. java基础之类与对象3

    前面我的两篇文章主要介绍了将怎么将事物抽象为对象,以及对象的实例化(就是new一个对象).这篇文章里面我就讲下匿名对象... 还是就举之前的例子把,Car c = new Car();看到这个我们就知 ...

  8. 《Python自然语言处理》第二章-习题解答-练习6

    问题描述:在比较词表的讨论中,创建一个对象叫做translate,通过它你可以使用德语和意大利语词汇查找对应的英语词汇.这种方法可能会出现什么问题,你能提出一个办法来避免这个问题吗? 虽然这是一道初级 ...

  9. 给 endv 取个好名字有赏!

    给 endv 取个好名字有赏! 直接回复即可 给 endv 取个好名字,拆分原则 endv = endv endv = end+v endv = en+d+v endv = en+dv endv = ...

  10. [洛谷P2580]于是他错误的点名开始了

    洛谷P2580的一个水题,用啥都能过,不过为了练习一下刚刚学会的字典树,还是认真做一下吧. #include <cstdio> #include <cstring> using ...