软件体系结构实验二
1. 实现”四则运算“的简易翻译器
1.1 要求
- 实现加减乘除四则运算,允许同时有多个操作数,如:4+6*5-8 结果是26;
- 被操作数为整数,整数可以有多位;
- 处理空格;
- 输入错误显示错误提示,并返回命令状态“CALC"。
1.2 思路
由于乘除优于加减运算,因此不妨先进行所有的乘除运算,并且将这些乘除运算后的整数值放回原来表达式的相应位置,则随后整个表达式的值,就等于一系列整数加减后的值。
基于此,我们可以用一个栈,保存这些(进行乘除运算后的)整数的值,对于加减号后的数字,将其直接压入栈中;对于乘除号后的数字,可以直接与栈顶元素进行计算,并且换栈顶元素为计算后的结果。
具体来说,遍历表达式字符串express
,并用变量preSign
记录每个数字之前的运算符,对于第一个数字,其之前的运算符视为加号。每次遍历到数字末尾时,根据preSign
来决定计算方式:
- 加号:将数字压入栈;
- 减号:将数字的相反数压入栈;
- 乘除号:计算数字与栈顶元素,并将栈顶元素替换为计算结果。
代码实现中,若读到一个运算符,或者遍历到字符串末尾,即认为是遍历到了数字末尾。处理完该数字后,更新preSign
为当前遍历的字符。
遍历完表达式字符串express
后,将栈中元素相加,即为该表达式的值。
import java.util.Deque;
import java.util.LinkedList;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
final String cmd = "CALC> ";
Scanner in = new Scanner(System.in);
while (true){
System.out.print(cmd);
String expression = in.nextLine();
System.out.println(calculate(expression));
}
}
public static int calculate(String expression) {
//处理空格
expression.trim();
Deque<Integer> stack