1.逆波兰表达式
package 第五天递归;
import java.util.Scanner;
public class 逆波兰 {
//static int [] a=new int[20];
static Scanner scanner=new Scanner(System.in);
static double bolan(){
String s=scanner.next();
switch (s.charAt(0)){
case '+':return bolan()+bolan();
case '-':return bolan()-bolan();
case '*':return bolan()*bolan();
case '/':return bolan()/bolan();
default:return Double.parseDouble(s);
}
}
public static void main(String[] args) {
System.out.printf("%f\n",bolan());
}
}
注意事项:
1.String和char的区别
字符串和字符
2.next和nextLine的区别
一个忽略空行,一个不忽略
3.String,charAt(int i)寻找指定为的字符
4.double类型的输出(%f)
5.将字符串转换成double类型的数字Double.parsedouble
算法思想:
看代码
2.表达式求值
解题代码:
package 第五天递归;
import java.util.Scanner;
public class 表达式求职 {
static Scanner scanner=new Scanner(System.in);
static char[] num;
static int i=0;
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
num=scanner.nextLine().toCharArray();//读入一行表达式将它转换成一个char数组
System.out.println(expression_value());
}
static int factor_value(){//求一个因子的值
int result=0;
char s=num[i];
if(s=='('){
i++;
result=expression_value();
if(i<num.length-1)
i++;
}else{
while (Character.isDigit(s)&i<num.length){
result=10*result+s-'0';//高位数的记录
if(i<num.length-1) {//当输入的表达式结尾是数字
i++;
s=num[i];
}
else break;
}
}
return result;
}
static int term_value(){//求一个项的值
int result =factor_value();//读入一个项
boolean more=true;
while (more){
char s=num[i];
if(s=='*'||s=='/'){
i++;
int value=factor_value();
if(s=='*')
result*=value;
else
result /=value;
}
else more=false;
}
return result;
}
static int expression_value(){//求一个表达式的值
int result =term_value();//读入一个项
boolean more=true;
while (more){
char s=num[i];
if(s=='+'||s=='-'){
i++;
int value=term_value();
if(s=='+')
result+=value;
else
result -=value;
}
else more=false;
}
return result;
}
}
//注意数组越界的问题!!!
注意事项:scanner.nextLine().toCharArray();//读入一行表达式将它转换成一个char数组