根据优先关系矩阵使用逐次加一发构造优先函数(Java)
若已知运算符之间的优先关系,可按如下步骤构造优先函数:
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)的更多相关文章
- Tomcat的class加载的优先顺序
Tomcat的class加载的优先顺序一览 1.最先是$JAVA_HOME/jre/lib/ext/下的jar文件. 2.环境变量CLASSPATH中的jar和class文件. 3.$CATALINA ...
- Springboot学习01- 配置文件加载优先顺序和本地配置加载
Springboot学习01-配置文件加载优先顺序和本地配置加载 1-项目内部配置文件加载优先顺序 spring boot 启动会扫描以下位置的application.properties或者appl ...
- java8--类加载机制与反射(java疯狂讲义3复习笔记)
本章重点介绍java.lang.reflect包下的接口和类 当程序使用某个类时,如果该类还没有被加载到内存中,那么系统会通过加载,连接,初始化三个步骤来对该类进行初始化. 类的加载时指将类的clas ...
- 【机器学习】梯度、Hessian矩阵、平面方程的法线以及函数导数的含义
想必单独论及" 梯度.Hessian矩阵.平面方程的法线以及函数导数"等四个基本概念的时候,绝大部分人都能够很容易地谈个一二三,基本没有问题. 其实在应用的时候,这几个概念经常被混 ...
- 梯度、Hessian矩阵、平面方程的法线以及函数导数的含义
本文转载自: Xianling Mao的专栏 =========================================================================== 想 ...
- php实现数字格式化,数字每三位加逗号的功能函数
原地址:http://www.jb51.net/article/73781.htm php实现数字格式化,数字每三位加逗号的功能函数,具体代码如下: ? 1 2 3 4 5 6 7 8 9 10 11 ...
- Javascript兑现图片预加载【回调函数,多张图片】 (转载)
Javascript实现图片预加载[回调函数,多张图片] 使用JS实现一组图片动画效果或者使用HTML5 Canvas渲染一系列图片等案例中,需要图片全部加载完成方可运行动画效果.此时程序中就会涉及多 ...
- javascript window.onload 加载多个函数的方法
用法如下: function func(){alert("this is window onload event!");return;} window.onload=func; 或 ...
- HDU 4549 矩阵快速幂+快速幂+欧拉函数
M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Sub ...
随机推荐
- .net core版 文件上传/ 支持批量上传,拖拽以及预览,bootstrap fileinput上传文件
asp.net mvc请移步 mvc文件上传支持批量上传,拖拽以及预览,文件内容校验 本篇内容主要解决.net core中文件上传的问题 开发环境:ubuntu+vscode 1.导入所需要的包:n ...
- javaWEB与Session
HttpSession(*****)1. HttpSession概述 * HttpSession是由JavaWeb提供的,用来会话跟踪的类.session是服务器端对象,保存在服务器端!!! * ...
- WebStorm里启动electron项目
WebStorm里启动electron项目,其实很简单 一.第一步打开下面的窗口 二.然后输入electron .,然后敲下 回车键,然后等会项目界面就会出现了. PS:electron 和 点之间有 ...
- 手机自动化测试:Appium源码分析之跟踪代码分析八
手机自动化测试:Appium源码分析之跟踪代码分析八 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家 ...
- 老李分享:开发python的unittest结果输出样式
老李分享:开发python的unittest结果输出样式 Python的unittest结果命令行输出,格式比较乱.为了提高格式输出的可读性,实现可以不同的颜色标识.所以准备扩展Python的un ...
- Android系统结构
从上图中可以看出,Android系统架构为四层结构,从上层到下层分别是应用程序层.应用程序框架层.系统运行库层以及Linux内核层,分别介绍如下: (1)Appliacation Android平台不 ...
- Java线程池使用和分析(二) - execute()原理
相关文章目录: Java线程池使用和分析(一) Java线程池使用和分析(二) - execute()原理 execute()是 java.util.concurrent.Executor接口中唯一的 ...
- android正则表达式隐藏邮箱地址中间字符
// String emailStr = email.substring(0, email.lastIndexOf("@"));// if (emailStr.length() & ...
- Extjs6组件——Form大家族成员介绍
本文基于ext-6.0.0 一.xtype form一共有12种xtype,下面来一一举例说一下. 1.textfield 这个是用的最多的form之一. { xtype: 'textfield', ...
- Java中的多线程Demo
一.关于Java多线程中的一些概念 1.1 线程基本概念 从JDK1.5开始,Java提供了3中方式来创建.启动多线程: 方式一(不推荐).通过继承Thread类来创建线程类,重写run()方法作为线 ...