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

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. 1.WP8.1开发_去除闪动效果,直接进入首页

    有时候希望打开软件的时候,不出现闪屏,而直接进入到第一个页面. 把第一个页面作为闪屏,可以制作一些进度条  和动画等... 很简单,有两种方法去除闪屏. 1.删除项目下 Assets 文件夹里面的Sp ...

  2. java学习笔记 --- 继承

    继承 (1)定义:把多个类中相同的成员给提取出来定义到一个独立的类中.然后让这多个类和该独立的类产生一个关系,    这多个类就具备了这些内容.这个关系叫继承.  (2)Java中如何表示继承呢?格式 ...

  3. asp.net core mvc剖析:动作执行

    紧跟上一篇文章.通过路由和动作匹配后,最终会得到跟当前请求最匹配的一个ActionDescriptor,然后通过IActionInvoker执行动作. 我们先来看一下IActionInvoker如何得 ...

  4. iOS开发之transform

    transform主要应用于动画 1.让一个按钮每次向上移动100的距离 UIButton *head = (UIButton *)[self.view viewWithTag:10]; head.t ...

  5. Cassandra存储time series类型数据时的内部数据结构?

        因为我一直想用Cassandra来存储我们的数字电表中的数据,按照之前的文章(getting-started-time-series-data-modeling)的介绍,Cassandra真的 ...

  6. 学习Jammendo代码的心路历程(二)ViewFlipper数据的填充

    打开Jammendo进入到首页之后,会看到这样一个界面.可以看到下左效果,我们可以看到,他是上部分的ViewFlipper模块和下半部分的listview模块构成的,今天就简单的说一下Jammendo ...

  7. SQLServer数据库中开启CDC导致“事务日志空间被占满,原因为REPLICATION”的原因分析和解决办法

    本文出处:http://www.cnblogs.com/wy123/p/6646143.html SQLServer中开启CDC之后,在某些情况下会导致事务日志空间被占满的现象为:在执行增删改语句(产 ...

  8. Android敏感词过滤主要类

    package com.tradeaider.app.utils; import com.tradeaider.app.activity.MyApplication;import java.util. ...

  9. BroadcastReceiver简单应用实例

    BroadcastReceiver是android四大组件之一,主要用于接收广播,它的简单实现方法如下: 1.定义继承BroadcastReceiver的MyReceiver类: /** * Crea ...

  10. 设置ZooKeeper服务器地址列表源码解析及扩展

    设置ZooKeeper服务器地址列表源码解析及扩展 ZooKeeper zooKeeper = new ZooKeeper("192.168.109.130:2181",SESSI ...