下面是我自己编写的一个实现后缀表达式的代码,基本功能是实现了,但是还是存在不少的问题,本人小菜鸟一个,因此特在此向Java高手请求指点。下面是代码部分。
package com;
import java.util.Scanner;
import java.util.Stack;
public class TestCharAt {
public static void main(String[] args) {
TestCharAt c = new TestCharAt();
Scanner scan = new Scanner(System.in);
System.out.println("请输入一个后缀表达式:");
String str = scan.nextLine();
System.out.println("计算结果:" + c.value(str));
}
/**
*后缀表达式执行计算
**/
public String value(String str){
Stack<Double> s = new Stack<Double>();
Double x,y;//定义x,y用于保存浮点数
float m;//定义m用于暂存函数运算的结果
char[] c = str.toCharArray();//转换为字符数组
int i = 0;
//扫描后缀表达式中的每个字符,并进行相应处理
try{
while(i<c.length){
char t = ' ';
if(c[i]==' ') {//扫描到空格字符不做任何处理
i++;continue;
}
switch(c[i]){
case '+': //做栈顶的两个元素的加法,和赋值给x
x=s.pop()+s.pop();
i++;break;
case '-': //做栈顶的两个元素的减法,差赋值给x
x=s.pop();//弹出减数
x=s.pop()-x;//弹出被减数
i++;break;
case '*': //做栈顶的两个元素的乘法,积赋值给x
x=s.pop()*s.pop();
i++;break;
case '/': //做栈顶的两个元素的除法,商赋值给x
x=s.pop();//弹出除数
if(x!=0.0)//弹出被除数,并计算
x=s.pop()/x;
else {//除数为0时,输出"除数不能为0"
return "除数不能为0!";
}
i++;break;
case '^'://乘方运算
x=s.pop();
x=Math.pow(s.pop(),x);
i++;break;
case '%'://求余运算
x=s.pop();
x=s.pop()%x;
i++;break;
case 'l'://对数函数运算
double a=s.pop();
if(a<=0){//底数必须为正数
return "输入无效";
}
else{
x=Math.log10(a);
}
i++;break;
case 's'://正弦函数运算
double x1 =s.pop();
if(Math.abs(x1) % 180 == 0){
x = 0.0;
}
else{
m=(float)Math.sin(x1*Math.PI/180);
x = (double) m;
}
i++;break;
case 'c'://余弦函数运算
double x2 =s.pop();
if(Math.abs(x2) % 180 == 90){
x = 0.0;
}
else{
m=(float)Math.cos(x2*Math.PI/180);
x = (double) m;
}
i++;break;
case 't'://正切函数运算
double x3=s.pop();
if(Math.abs(x3) % 180 == 90){//判断正切函数的输入值
return "输入无效";
}
else if(Math.abs(x3) % 180 == 0){
x = 0.0;
}
else{
m = (float) Math.tan(x3*Math.PI/180);