float x=0;
float y=0;
//正则的匹配规则
Pattern p = Pattern.compile("[1-9][0-9]*?x[+,-][1-9][0-9]*?y=[1-9][0-9]*?");
Scanner c=new Scanner(System.in);
System.out.println("请输入第一个方程:");
String num1=c.next();
System.out.println("请输入第二个方程:");
String num2=c.next();
if(p.matcher(num1).matches()&&p.matcher(num2).matches()){
float a1=new Float(num1.substring(0,num1.indexOf("x")));
String op1=num1.substring(num1.indexOf("x")+1,num1.indexOf("x")+2);
float b1=new Float(num1.substring(num1.indexOf("x")+2,num1.indexOf("y")));
float c1=new Float(num1.substring(num1.indexOf("=")+1));
float a2=new Float(num2.substring(0,num2.indexOf("x")));
String op2=num2.substring(num2.indexOf("x")+1,num2.indexOf("x")+2);
float b2=new Float(num2.substring(num2.indexOf("x")+2,num2.indexOf("y")));
float c2=new Float(num2.substring(num2.indexOf("=")+1));
if(op1.equals(op2)){
x=(c1*b2-c2*b1)/(a1*b2-a2*b1);
}else{
x=(c1*b2+c2*b1)/(a1*b2+a2*b1);
}
if(op1.equals("-")){
y=(c1-a1*x)/(-b1);
}else{
y=(c1-a1*x)/b1;
}
System.out.println("x="+x+"\n"+"y="+y);
}else{
System.out.println("方程格式错误!");
}
X和Y的顺序如果转换呢?
存在空格也要考虑啊,正则要考虑很多东西的,不能只考虑你所以为的一些格式。
x+y-3=0的这些奇怪的格式就处理不了
import java.util.List;
import java.util.Scanner;/**
* 输入一个式子,要求算出式的值
*/
public class DengShi2 {
public static void main(String[] args) {
try {
String houZhui = zhuanHuan("3+(20+1)*2");
System.out.println(houZhui);
int sum=jiSuanHouZhui(houZhui);
System.out.println(sum);
} catch (Exception e) {
System.out.println("出错");
e.printStackTrace();
}
} /** 中追表达式转换后缀表达式 */
public static String zhuanHuan(String shiZi) throws Exception {
String houZhui = "";// 存放后缀表达式的字符串
List<Character> stack = new ArrayList<Character>();// 一个栈
char[] cArray = shiZi.toCharArray();
// 读取中缀表达式
for (char c : cArray) {
if (c >= '0' && c <= '9') {// 如果是数字,直接放入输出队列
houZhui += c + "";
} else if (c >= 42 && c <= 47) {// 如果是运算符
if (stack.size() != 0) {// 不为空的时候才操作
// 如果栈顶元素是左括号,直接进栈
if (stack.get(stack.size() - 1) == '(') {
stack.add(c);
continue;
} else {
switch (isYouXian(c, stack.get(stack.size() - 1))) {// 比较运算符栈顶元素的运算符
case 1:// 当大于的时候,入栈
stack.add(c);
continue;
case 0:// 当等于的时候,出栈 case -1:// 当小于的时候,出栈,且进栈
houZhui += stack.get(stack.size() - 1) + "";
stack.remove(stack.size() - 1);
stack.add(c);
continue;
default:// 当出现栈为空的情况下就直接进栈
break;
}
}
} else {// 为空时,直接加入
stack.add(c);
}
} else if (c == '(') {// 如果是左括号,进栈
stack.add(c);
} else {// 剩下的就是右括号了,读到右括号时,将靠近栈顶的第一个左括号上面的运算符全部依次弹出,送至输出队列后,再丢弃左括号
for (int i = stack.size() - 1; i >= 0; i--) {// 遍历栈内de内容,
if (stack.get(i) != '(') {// 如果不是左括号,全部出栈
houZhui += stack.get(i) + "";
stack.remove(i);
} else {// 如果是左括号,直接移除左括号
stack.remove(i);
break;
}
}
}
}
// 最后全部出栈
for (int i = stack.size() - 1; i >= 0; i--) {
houZhui += stack.get(i);
stack.remove(i);
}
return houZhui;
} /** 后缀表达式的计算 */
public static int jiSuanHouZhui(String houZhui) {
/*
* 运用后缀表达式进行计算的具体做法: ·建立一个栈S
* ·从左到右读后缀表达式,读到数字就将它转换为数值压入栈S中,读到运算符则从栈中依次弹出两个数分别到Y和X,然后以“X 运算符
* Y”的形式计算机出结果,再压加栈S中 ·如果后缀表达式未读完,就重复上面过程,最后输出栈顶的数值则为结束
*/
int sum = 0;
char[] cArray = houZhui.toCharArray();
List<Integer> stack = new ArrayList<Integer>();
int first, second;
for (char c : cArray) {
if (c >= '0' && c <= '9') {// 如果是数字,直接如栈
stack.add((int) (c - '0'));
} else {// 如果是运算符
first = stack.get(stack.size() - 1);
stack.remove(stack.size() - 1);// 出栈两个
second =stack.get(stack.size() - 1);
stack.remove( stack.size() - 1);// 出栈两个
switch (c) {// 计算
case '+':
sum = second + first;
break;
case '-':
sum = second - first;
break;
case '*':
sum = second * first;
break;
case '/':
sum = second / first;
break;
default:
break;
}
// 将运算得到的值入栈*
stack.add(sum);
}
}
return sum;
} /** 判断运算符优先级的方法,返回运算符1是否优先于运算符2,优先的话就返回1,相等的话就返回0,不优先于就返回0 */
public static int isYouXian(char yunSuanFu1, char yunSuanFu2) {
int flag = 0;
if ((yunSuanFu1 == 42 && yunSuanFu2 == 47)
|| (yunSuanFu1 == 47 && yunSuanFu2 == 42)) {// 如果是乘除
flag = 0;
} else if ((yunSuanFu1 == 45 && yunSuanFu2 == 43)
|| (yunSuanFu1 == 43 && yunSuanFu2 == 45)
|| yunSuanFu1 == yunSuanFu2) {// 如果是加减
flag = 0;
} else if ((yunSuanFu1 == 42 || yunSuanFu1 == 47)
&& (yunSuanFu2 == 43 || yunSuanFu2 == 45)) {// 如果是乘除与加减
flag = 1;
} else {
flag = -1;
}
return flag;
}
}
对于正则不是很熟,所以才发出来集思广益。小数的情况考虑到了,我用的是float类型。因为是初步的版本,所以有很多的局限性,不是让你们改错。是希望你们能加以改造~~进一步完善