在所谓的逆波兰标记法中,操作符是在其作用的操作数之后被输入的。
如你如果想要计算8*4+6/3则需要按以下步骤输入:
8 enter 4 * 6 enter 3 / +
思路还是利用栈来保存数据以此来方便计算。
下面直接给出代码:
import java.util.Scanner;
import java.util.Stack;
public class RPNCalculator {
public void run() {
Scanner sysin=new Scanner(System.in);
System.out.println("RPN型计算器,按下H显示帮助信息");
Stack<Double> operandStack=new Stack<Double>();
while(true) {
System.out.println("请输入:");
String line=sysin.nextLine();
char ch=Character.toUpperCase(line.charAt(0));
if(ch=='Q') {
break;
}else if(ch=='C') {
operandStack.clear();
}else if(ch=='H') {
helpCommand();
}else if(Character.isDigit(ch)) {
operandStack.push(Double.parseDouble(line));
}else if(ch=='+'||ch=='-'||ch=='*'||ch=='/') {
applyOperator(ch,operandStack);
}else {
System.out.println("无法识别的指令"+ch);
}
}
sysin.close();
}
private void applyOperator(char op, Stack<Double> operandStack) {
double result;
double rhs=operandStack.pop();
double lhs=operandStack.pop();
switch (op) {
case '+':
result=lhs+rhs;
break;
case '-':
result=lhs-rhs;
break;
case '*':
result=lhs*rhs;
break;
case '/':
result=lhs/rhs;
break;
default:
throw new RuntimeException("无法识别的操作符"+op);
}
System.out.println(String.format("%.5f", result));
operandStack.push(result);
}
private void helpCommand() {
System.out.println("这是一个简易计算器,以逆波兰标记法输入表达式为核心的计算器。");
System.out.println("其中,运算符在其应用的操作数之后。每行由一个数字、一个操作符或以下命令组成");
System.out.println("Q----------退出计算器程序");
System.out.println("H----------再次显示帮助信息");
System.out.println("C----------清空计算器的栈程");
}
public static void main(String[] args) {
new RPNCalculator().run();
}
}