32,685
社区成员
发帖
与我相关
我的任务
分享
java中用的很。JVM编译的时候就是对我们写的代码进行了解释操作;数据库SQL语句亦是如此
解释器:对语言进行解释,根据不同语义来做不同的事情。
举例:双栈计算器
public class 双栈实现计算器 {
//设置两栈
private static Deque<Character> opr = new LinkedList<>();
private static Deque<Double> number = new LinkedList<>();
public static void main(String[] args) {
//接收一串字符串并转字符数组
Scanner scanner = new Scanner(System.in);
String str = scanner.nextLine();
char [] arrC = str.toCharArray();
for (int i = 0; i < arrC.length;) {
char c = arrC[i];
//是+-/*字符时
if (isChar(c)){
///如果栈内有字符,则需要判断优先级,入栈字符小于等于栈内字符则需要先计算栈内字符
Character peek = opr.peek(); //细节!!! 这里必须先取
while (peek!=null && isLowIn(c,peek)){
cal();
peek=opr.peek(); //细节!!这里也必须更新peek
}
//入栈
opr.push(c);
i++;
}
//字符是数字时
else {
double sum=0; //接收整数和
double sum2=0; //接收小数和
int times = 1; //记录当前小数位数
boolean flag=false; //是否开启小数检测模式
//判断下一个是不是+-*/,不是的话就继续判断直到非数字
while (i<=arrC.length-1 && !isChar(arrC[i])){ //细节:括号内两者顺序不能改变
//遇到小数的情况
if (arrC[i]=='.'){
flag=true;
}else {
//小数情况
if (flag){
double val=arrC[i]-'0';
for (int j = 0; j < times; j++) { //细节!用times缩小值
val/=10.0;
}
times++;
sum2+=val;
}
//正数情况
else {
sum=sum*10+arrC[i]-'0'; //获取多位数字的关键!!!
}
}
i++;
}
number.push(sum+sum2);
}
}
//字符都获取完了后栈内还有数字和字符的话,就计算完栈内的数据并输出最终结果
while (!opr.isEmpty()) cal();
System.out.println(number.peek());
}
//判断是否为字符
public static boolean isChar(char c) {
return c=='+'||c=='-'||c=='*'||c=='/';
}
//判断优先级是否是栈外字符小于等于栈内字符
public static boolean isLowIn(char out,char in){
return (out=='+'||out=='-')||(in=='*'||in=='/');
}
public static void cal(){
//从栈内取出两个数组和一个字符
double a = number.pop();
double b = number.pop();
char c = opr.poll();
//根据字符c进行不同的运算
switch (c){
case '+':
number.push(a+b);
break;
case '-':
number.push(b-a);
break;
case '*':
number.push(b*a);
break;
case '/':
number.push(b/a);
break;
default:
System.out.println("字符输入有误");
}
}
}