300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 用java写四则混合运算 JAVA写的四则混合运算-JSP教程 Java技巧及代码

用java写四则混合运算 JAVA写的四则混合运算-JSP教程 Java技巧及代码

时间:2023-07-31 17:36:53

相关推荐

用java写四则混合运算 JAVA写的四则混合运算-JSP教程 Java技巧及代码

这是一个四则混合运算程序,没什么做优化,也没做什么注释,(人啊,总喜欢偷懒的.)

这个版本我已经定为了2.21版本.呵呵.

从最先的1.0到2.0的改动很大.除了运算思想没动处,其它的都在2.0做了重新设计.

这种程序其实网上一大把(算法也好得多)。此仅为无聊找点事情做而已。

/**

*四则混合运算程序

*作者:黄剑武

*时间:4月29日

*版本:2.21

*修改日志:2.0

*1.更改表达式用户输入方式.

*2.对用户输入的表达式进行有效性字符过滤.

*3.使用double代替原int数值,并且使用严格浮点运算提高运算精度.

*4.解除对运算数字只能是一位的限制.

*5.优化了部分代码.

*修改日志:2.1

* 1.加入表达式括号匹配功能.

*修改日志:2.2

* 1.加入表达式处理功能.

*修改日志:2.21

* 1.修改部分语法以支持jdk1.5中的泛型用法.

*/

import java.lang.reflect.array;

import java.util.*;

import java.util.regex.*;

import java.lang.*;

import java.io.*;

//测试用例:1-3*(4-(2+5*3)+5)-6/(1+2)=23

//测试用例:11.2+3.1*(423-(2+5.7*3.4)+5.6)-6.4/(15.5+24)=1273.4199746835445

class calculator

{

public static void main(string[] args) throws ioexception

{

string str_input;

double f_output;

while (true)

{

system.out.print(“输入表达式: “);

system.out.flush();

str_input = getstring();

if (str_input.equals(“”))

{

break;

}

calculator calculator = new calculator();

//以下对输入字符串做规则处理

str_input = calculator.checkexpression(str_input);

if (str_input.equals(“”))

{

system.out.println(” 表达式出错 “);

}

//以下对输入字符串做表达式转换

vector v_compute = calculator.getexpression(str_input);

/*

for (int i=0;i

{

system.out.println(” “+v_compute.get(i));

}

*/

//以下进行后缀表达式转换

vector v_tmp_prefix = calculator.transformprefix(v_compute);

/*

for (int i=0;i

{

system.out.println(v_tmp_prefix.get(i));

}

*/

//以下进行后缀表达式运算

f_output = calculator.evaluateprefix(v_tmp_prefix);

system.out.println(“结果 = ” + f_output);

}

}

/**

*静态方法,用来从控制台读入表达式

*/

public static string getstring() throws ioexception

{

inputstreamreader isr = new inputstreamreader(system.in);

bufferedreader br = new bufferedreader(isr);

string s = br.readline();

return s;

}

/**

*输入字符串转换.把从控制台读入的字符串转成表达式存在一个队列中.

*例:123+321 存为”123″”+””321″

*/

public vector getexpression(string str)

{

vector v_temp = new vector();

char[] temp = new char[str.length()];

str.getchars(0,str.length(),temp,0);

string fi = “”;

int x=0,i=0;

string regex_fig = “[\\.\\d]”; //匹配数字和小数点

string regex_operator = “[\\+\\-\\*/\\(\\)]”; //匹配运算符(+,-,*,/)和括号(“(“,”)”)

pattern p_fig = pile(regex_fig);

pattern p_operator = pile(regex_operator);

matcher m = null;

boolean b;

while (i

{

character c = new character(temp[i]);

string s = c.tostring();

//system.out.println(“char c = “+s);

m = p_operator.matcher(s);

b = m.matches();

if (b)

{

//system.out.println(“matches operator”);

v_temp.add(fi);

fi=””;

v_temp.add(s);

}

m = p_fig.matcher(s);

b = m.matches();

if (b)

{

//system.out.println(“matches fig”);

fi=fi+s;

}

i++;

}

v_temp.add(fi);

return v_temp;

}

/**

*转换中序表示式为前序表示式

*/

public vector transformprefix(vector v_expression)

{

vector v_prefix = new vector();

stack s_tmp = new stack();

string regex_float = “\\d+(\\.\\d+)?”; //匹配正浮点数

pattern p_float = pile(regex_float);

matcher m = null;

boolean b;

string str_elem = “”;

for (int i=0;i

{

str_elem = v_expression.get(i).tostring();

m = p_float.matcher(str_elem);

b = m.matches();

if (b)

{

v_prefix.add(str_elem);

}

if (str_elem.equals(“+”)||str_elem.equals(“-“))

{

if (s_tmp.isempty())

{

s_tmp.push(str_elem);

}

else

{

while(!s_tmp.isempty())

{

string str_tmp = s_tmp.peek();

if ( str_tmp.equals(“(“))

{

break;

}

else

{

v_prefix.add(s_tmp.pop());

}

}

s_tmp.push(str_elem);

}

}

if (str_elem.equals(“*”)||str_elem.equals(“/”))

{

if (s_tmp.isempty())

{

s_tmp.push(str_elem);

}

else

{

while(!s_tmp.isempty())

{

string str_tmp = s_tmp.peek();

if ( str_tmp.equals(“(“) || str_tmp.equals(“+”) || str_tmp.equals(“-“))

{

break;

}

else

{

v_prefix.add(s_tmp.pop());

}

}

s_tmp.push(str_elem);

}

}

if (str_elem.equals(“(“))

{

s_tmp.push(str_elem);

}

if (str_elem.equals(“)”))

{

while(!s_tmp.isempty())

{

string str_tmp = s_tmp.peek();

if (str_tmp.equals(“(“))

{

s_tmp.pop();

break;

}

else

{

v_prefix.add(s_tmp.pop());

}

}

}

}

while(!s_tmp.isempty())

{

v_prefix.add(s_tmp.pop());

}

return v_prefix;

}

/**

*前缀表示式求值

*/

public strictfp double evaluateprefix(vector v_prefix)

{

string str_tmp = “”;

double num1,num2,interans = 0;

stack s_compute = new stack();

int i = 0;

while(i

{

str_tmp = v_prefix.get(i).tostring();

if (!str_tmp.equals(“+”) && !str_tmp.equals(“-“) && !str_tmp.equals(“*”) && !str_tmp.equals(“/”))

{

interans = s_compute.push(double.parsedouble(str_tmp));

}

else

{

num2=(double)(s_compute.pop());

num1=(double)(s_compute.pop());

if (str_tmp.equals(“+”))

{

interans = num1+num2;

}

if (str_tmp.equals(“-“))

{

interans = num1-num2;

}

if (str_tmp.equals(“*”))

{

interans = num1*num2;

}

if (str_tmp.equals(“/”))

{

interans = num1/num2;

}

s_compute.push(interans);

}

i++;

}

return interans;

}

/**

*括号匹配检测

*/

public boolean checkbracket(string str)

{

stack s_check = new stack();

boolean b_flag = true;

for (int i=0;i

{

char ch = str.charat(i);

switch(ch)

{

case (:

s_check.push(ch);

break;

case ):

if (!s_check.isempty())

{

char chx = s_check.pop();

if (ch==) && chx!=()

{

b_flag = false;

}

} else {

b_flag = false;

}

break;

default:

break;

}

}

if (!s_check.isempty())

{

b_flag = false;

}

return b_flag;

}

/**

*表达式正确性规则处理与校验

*/

public string checkexpression(string str)

{

stack s_check = new stack();

stack s_tmp = new stack();

string str_result = “”;

string str_regex = “^[\\.\\d\\+\\-\\*/\\(\\)]+$“; //匹配合法的运算字符”数字,.,+,-,*,/,(,),”

pattern p_filtrate = pile(str_regex);

matcher m = p_filtrate.matcher(str);

boolean b_filtrate = m.matches();

if (!b_filtrate)

{

str_result = “”;

return str_result;

}

string str_err_float = “.*(\\.\\d*){2,}.*”; //匹配非法的浮点数.

pattern p_err_float = pile(str_err_float);

matcher m_err_float = p_err_float.matcher(str);

boolean b_err_float = m_err_float.matches();

if (b_err_float)

{

str_result = “”;

return str_result;

}

for (int i=0;i

{

char ch = str.charat(i);

if (checkfig(ch))

{

if (!s_tmp.isempty()&&s_tmp.peek()==))

{

str_result = “”;

return str_result;

}

s_tmp.push(ch);

str_result = str_result+ch;

}

switch(ch)

{

case (:

if (!s_tmp.isempty()&&s_tmp.peek()==.)

{

str_result = “”;

return str_result;

}

s_check.push(ch);

if (s_tmp.isempty()||(!this.checkfig(s_tmp.peek())&&s_tmp.peek()!=)))

{

str_result = str_result+ch;

} else {

str_result = str_result+”*”+ch;

}

s_tmp.push(ch);

break;

case ):

if (!s_check.isempty())

{

char chx = s_check.pop();

if (ch==) && chx!=()

{

str_result = “”;

return str_result;

}

} else {

str_result = “”;

return str_result;

}

if (s_tmp.peek()==.||(!this.checkfig(s_tmp.peek())&&s_tmp.peek()!=)))

{

str_result = “”;

return str_result;

}

s_tmp.push(ch);

str_result = str_result+ch;

break;

case +:

case -:

if (!s_tmp.isempty()&&(s_tmp.peek()==+||s_tmp.peek()==-||s_tmp.peek()==*||s_tmp.peek()==/||s_tmp.peek()==.))

{

str_result = “”;

return str_result;

}

if (s_tmp.isempty()||s_tmp.peek()==()

{

str_result = str_result+”0″+ch;

} else {

str_result = str_result+ch;

}

s_tmp.push(ch);

break;

case *:

case /:

if (s_tmp.isempty()||s_tmp.peek()==.||(!this.checkfig(s_tmp.peek())&&s_tmp.peek()!=)))

{

str_result = “”;

return str_result;

}

s_tmp.push(ch);

str_result = str_result+ch;

break;

case .:

if (s_tmp.isempty()||!this.checkfig(s_tmp.peek()))

{

str_result = str_result+”0″+ch;

} else {

str_result = str_result+ch;

}

s_tmp.push(ch);

break;

default:

break;

}

}

if (!s_check.isempty())

{

str_result = “”;

return str_result;

}

return str_result;

}

private static boolean checkfig(object ch)

{

string s = ch.tostring();

string str_regexfig = “\\d“; //匹配数字

pattern p_fig = pile(str_regexfig);

matcher m_fig = p_fig.matcher(s) ;

boolean b_fig = m_fig.matches();

return b_fig;

}

};

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。