「后缀表达式java」后缀表达式转换
今天给各位分享后缀表达式java的知识,其中也会对后缀表达式转换进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
- 1、java如何求出字符串表达式的结果?如“23+4*5-56/4+(2*5+4)”
- 2、(java程序题)输入四个数字的加减乘除表达式, 输出运算结果 样例输入 6.5-4*3+3 样例输出 -2.5?
- 3、java 中字符串能不能直接转换为数学表达式进行计算,不可以要怎么转换,求具体代码。简单点,最好带括号
- 4、java后缀表达式实现表达式求值
- 5、java 设计算法,计算用后缀表示法表示的算术表达式的值。
java如何求出字符串表达式的结果?如“23+4*5-56/4+(2*5+4)”
你可以自己写个算法去解析字符串中的加减乘除括号等特殊字符,然后在计算。或者你写个存储过程,通过数据库的计算机制来计算。
(java程序题)输入四个数字的加减乘除表达式, 输出运算结果 样例输入 6.5-4*3+3 样例输出 -2.5?
这道题我使用的是栈来做的,如果是JDK1.6以上可以使用Java调用JavaScript做,这样代码量可以减少不少
import java.util.Scanner;
import java.util.Stack;
public class test{
public static void TrnsInToSufix(String IFX,String []PFX)//PFX放后缀表达式,IFX为中缀表达式
{
StringBuffer numBuffer = new StringBuffer();// 用来保存一个数的
StackString s=new StackString();//放操作符
String a;
s.push("=");//第一个为等号
int i=0,j=0;
char ch;
for(i=0;iIFX.length();)
{
ch=IFX.charAt(i);
switch(ch)
{
case '0':case '1':case '2':
case '3':case '4':case '5':
case '6':case '7':case '8':
case '9':
while(Character.isDigit(ch)||ch=='.')//拼数
{
numBuffer.append(ch); // 追加字符
ch = IFX.charAt(++i);
}
PFX[j++]=numBuffer.toString();//break;
numBuffer = new StringBuffer(); //清空已获取的运算数字
continue; //这里要重新循环,因为i已经增加过了
case '(':
s.push("(");break;
case ')':
while(s.peek()!="(")
PFX[j++]=s.pop();
break;
case '+':
case '-':
while(s.size()1s.peek()!="(")
PFX[j++]=s.pop();
a=String.valueOf(ch);
s.push(a);break;
case '*':
case '/':
while(s.size()1(s.peek()=="*")||s.peek()=="/"
||s.peek()=="s"||s.peek()=="c"||s.peek()=="t"
||s.peek()=="^"||s.peek()=="√")//优先级比较,与栈顶比较,
PFX[j++]=s.pop();//当前操作符优先级大于等于栈顶的弹出栈顶
a=String.valueOf(ch);
s.push(a);break;
case 's':
case 'c':
case 't'://三角函数
while(s.size()1(s.peek()=="s"||s.peek()=="c"||s.peek()=="t"
||s.peek()=="^"||s.peek()=="√"))//优先级比较,与栈顶,大于等于的弹出
PFX[j++]=s.pop();
a=String.valueOf(ch);
s.push(a);break;
case '^':// 幂
case '√':// 开方
while(s.size()1(s.peek()=="^"||s.peek()=="√"))
PFX[j++]=s.pop();
a=String.valueOf(ch);
s.push(a);break;
}
i++;
}
while(s.size()1)
PFX[j++]=s.pop();
PFX[j]="=";
}
public static String Evaluate (String []PFX)//后缀表达式求值
{
int i=0;
double x1,x2,n;
String str;
StackString s= new StackString();
while(PFX[i]!="=")
{
str=PFX[i];
switch(str.charAt(0))
{
case '0':case '1':case '2':
case '3':case '4':case '5':
case '6':case '7':case '8':
case '9':
s.push(str);break;
case '+':
x1=Double.parseDouble(s.pop());
x2=Double.parseDouble(s.pop());
n=x1+x2;
s.push(String.valueOf(n));break;
case '-':
x1=Double.parseDouble(s.pop());
x2=Double.parseDouble(s.pop());
n=x2-x1;
s.push(String.valueOf(n));break;
case '*':
x1=Double.parseDouble(s.pop());
x2=Double.parseDouble(s.pop());
n=x1*x2;
s.push(String.valueOf(n));break;
case '/':
x1=Double.parseDouble(s.pop());
x2=Double.parseDouble(s.pop());
n=x2/x1;
s.push(String.valueOf(n));break;
case 's':
x1=Double.parseDouble(s.pop());
n=Math.sin(x1 * Math.PI / 180);
s.push(String.valueOf(n));break;
case 'c':
x1=Double.parseDouble(s.pop());
n=Math.cos(x1 * Math.PI / 180);
s.push(String.valueOf(n));break;
case 't':
x1=Double.parseDouble(s.pop());
n=Math.tan(x1 * Math.PI / 180);
s.push(String.valueOf(n));break;
case '√':
x1=Double.parseDouble(s.pop());
n=Math.sqrt(x1);
s.push(String.valueOf(n));break;// 开方
case '^':
x1=Double.parseDouble(s.pop());
x2=Double.parseDouble(s.pop());
n=Math.pow(x2, x1);
s.push(String.valueOf(n));break;
}
i++;
}
return s.pop();
}
public static void main(String[] args) {
System.out.println("请输入一个表达式:");
String s= new Scanner(System.in).next();//sin45*2,sin 要用string.replace转换成 s
s+="=";
String[] PFX = new String[100];
TrnsInToSufix(s, PFX);
System.out.println("该算式的结果是:"+Evaluate(PFX));
}
}
java 中字符串能不能直接转换为数学表达式进行计算,不可以要怎么转换,求具体代码。简单点,最好带括号
可是可以,但是特别麻烦.
先要把中缀表达式,转换为后缀表达式,再计算后缀表达式.
通常把我们日常中看到的数学表达式称为中缀表达式如:(3+4)*5,
后缀表达式为计算机中容易计算的一种表达式.
A*B+C;转换为后缀表达式后为:AB*C+;
(A+B)*(C-D);转换为后缀表达式后为:AB+CD-*;
后缀表达式中没有括号,优先级为从左至右
后缀表达式较中缀表达式而言容易计算.
在中缀表达式中做一项运算要考虑优先级,所以要检查后面的字符
在后缀表达式中只要碰到运算符就可以运算了,直到表达式结束.
把中缀表达式转换为后缀表达式,再计算后缀表达式,这个两个过程都可以用数据结构(栈)来完成.
下面是一个C语言的例子.你看了应该会明白一点.(和JAVA差不多)
这是2008上半年程序员考试的题目,五个空分别为:
(1)prt++
(2)0
(3)*ptr-'0'
(4)s,tnum
(5)*result
不知道楼主为什么问这个问题,不可以用其它方式解决吗?
java后缀表达式实现表达式求值
import java.util.Scanner;
import java.util.Stack;
public class 表达式计算 {
private static StackString num = new StackString();//存后缀表达式
private static StackString sign = new StackString();//存入符号
private static StackInteger result = new StackInteger();//放结果
public static void getGroup(String line){//讲字符串转换为后缀表达式
for(int i=0; iline.length(); i++){
char c = line.charAt(i);
if((int)c=48 (int)c=57){//当遇到数字的时候,判断是不是多位数,然后在push进num
int j = i+1;
while(jline.length() (line.charAt(j)=48 line.charAt(j)=57)){
j++;
}
num.push(line.substring(i, j));
i = j-1;
}else if(c == '('){//遇到左括号直接存进num
sign.push(String.valueOf(c));
}else if(c == ')'){//遇到右括号从sign中pop栈顶元素push到num知道遇到'(',然后再pop掉'('
while(!sign.peek().equals("(")){
num.push(sign.pop());
}
sign.pop();
}else{
int n = 0;
if(!sign.empty()){//如果sign中没有元素,直接令n = 0
n = getNum(sign.peek().charAt(0));
}
int m = getNum(c);
if(m = n){//如果当前元素的运算级别比栈顶元素运算级别要高,就直接push进sign
sign.push(String.valueOf(c));
}else{
while(m n){//如果当前运算运算级别比sign栈顶元素运算级别要低,就将sign栈顶元素pop并且push进num,知道不符合条件
num.push(sign.pop());//输入例子2*3+6/3的时候,这里一直报错
if(!sign.empty()){
n = getNum(sign.peek().charAt(0));
}else{
n = 0;
}
}
sign.push(String.valueOf(c));
}
}
}
while(!sign.empty()){
num.push(sign.pop());
}
}
private static int getNum(char c){
int n = 0;
switch(c){
case '+':
case '-':
n = 1;
break;
case '*':
case '/':
n = 2;
break;
}
return n;
}
java 设计算法,计算用后缀表示法表示的算术表达式的值。
你好!
后缀表达式也称逆波兰表达式,其优点就在于可以方便的用栈实现表达式的值的计算。和你说一下思路吧:
·从头读入表达式
·如果遇到数则将其压入栈
·如果遇到运算符,从栈中弹出栈顶连个数,实行相应运算,将结果压入栈中
·直到表达式尾,此时栈中应该只有一个元素,即运算结果
·Over
如果对你有帮助,望采纳。
后缀表达式java的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于后缀表达式转换、后缀表达式java的信息别忘了在本站进行查找喔。