「后缀表达式java」后缀表达式转换

博主:adminadmin 2023-01-26 16:12:10 453

今天给各位分享后缀表达式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的信息别忘了在本站进行查找喔。