import java.util.Scanner;
/*
* 逆波兰表达式的转换与计算
*/
enum Symbol //java枚举类
{
left_parenthesis('(',1),right_parenthesis(')',1),multiplication_sign('*',2),devide('/',2)
,plus_sign('+',3),minus_sign('-',3);
private char symbol;
private int l;
private Symbol(char symbol,int l)
{
this.symbol=symbol;
this.l=l;
}
public char getSymbol()
{
return this.symbol;
}
public int getNum()
{
return this.l;
}
}
public class suanfa {
public static String conversion(String expression) //用于将普通的计算式转换为逆波兰表达式
{
String temp=""; //用来保存逆波兰表达式
int k=0;
String lin=""; //待会用来保存临时数字字符
Symbol[] save1=new Symbol[50]; //在过程中保存运算符
Symbol a1=Symbol.left_parenthesis;
Symbol a2=Symbol.right_parenthesis;
Symbol a3=Symbol.multiplication_sign;
Symbol a4=Symbol.devide;
Symbol a5=Symbol.plus_sign;
Symbol a6=Symbol.minus_sign;
int s1=0; //用来标注数字数组的下标
for(int i=0;i<expression.length();i++)
{
if(expression.charAt(i)==' ') //空格自动跳过
continue;
if(48<=(int)expression.charAt(i)&&(int)expression.charAt(i)<=57)
{
int re;
int m=0; //创建以个空字符
for(re=0;;re++)
{
if(i+re==expression.length())
break;
if((48<=(int)expression.charAt(i+re))&&((int)expression.charAt(i+re)<=57))
{
continue;
}
if((int)expression.charAt(i+re)<48||(int)expression.charAt(i+re)>57)
{
break;
}
}
m=Integer.parseInt(expression.substring(i,i+re));
temp+=m+" ";
i+=re-1;
continue;
}
if(expression.charAt(i)==a1.getSymbol()) //当为左括号时
{
save1[s1]=a1;
s1++;
k++;
continue;
}
if(expression.charAt(i)==a3.getSymbol()) //当为乘号时
{
save1[s1]=a3;
s1++;
continue;
}
if(expression.charAt(i)==a4.getSymbol()) //当为除号时
{
save1[s1]=a4;
s1++;
continue;
}
if(expression.charAt(i)==a5.getSymbol()) //当为加号时
{
if(s1!=0&&k==0&&save1[s1-1].getNum()<a5.getNum())
{
for(int g=s1-1;g>=0;g--)
{
temp+=save1[g].getSymbol()+" ";
save1[g]=null;
}
save1[0]=a5;
s1=1;
}
else
{
save1[s1]=a5;
s1++;
}
continue;
}
if(expression.charAt(i)==a6.getSymbol()) //当为减号时
{
if(s1!=0&&k==0&&save1[s1-1].getNum()<a6.getNum())
{
for(int g=s1-1;g>=0;g--)
{
temp+=save1[g].getSymbol()+" ";
save1[g]=null;
}
save1[0]=a6;
s1=1;
}
else
{
save1[s1]=a6;
s1++;
}
continue;
}
if(expression.charAt(i)==a2.getSymbol())
{
int m=s1-1;
while(save1[m].getSymbol()!='(')
{
temp+=save1[m].getSymbol()+" ";
save1[m]=null;
m--;
}
s1=m;
save1[s1]=null;
k--;
continue;
}
}
for(int p=s1-1;p>=0;p--)
{
temp+=save1[p].getSymbol();
}
return temp;
}
public static void main(String[] args)
{
Scanner in=new Scanner(System.in);
System.out.println("请输入算术表达式");
String m=in.nextLine();
System.out.println(conversion(m));
}
}