问题描述: 输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值
注: 1、表达式只含 +, -, *, /,
(, ), 四则运算符
2、表达式数值只包含个位整数(0-9),且不会出现0作为除数的情况
3、要考虑加减乘除按通常四则运算规定的计算优先级
4、除法用整数除法,即仅保留除法运算结果的整数部分。比如8/3=2。输入表达式保证无0作为除数情况发生
5、输入字符串一定是符合题意合法的表达式,其中只包括数字字符和四则运算符字符,除此之外不含其它任何字符,不会出现计算溢出情况
• 要求实现函数:
int calculate(int len,char *expStr)
【输入】 int len: 字符串长度;
char *expStr: 表达式字符串;
【输出】 无
【返回】 计算结果• 示例
1) 输入:char *expStr = “1+4*5-8/3”
函数返回:19
2) 输入:char *expStr = “8/3*3”
函数返回:6
1 package MyTest; 2 3 /** 4 * 简单的四则运算,每个参与运算的数字都在0-9之间。 5 */ 6 7 import java.util.*; 8 9 public class FourOps { 10 11 public static void main(String[] args) { 12 Scanner in = new Scanner(System.in); 13 while(in.hasNext()){ 14 String expretion = in.next(); 15 int length = expretion.length(); 16 int result = compute(length, expretion); 17 System.out.println(result); 18 } 19 20 } 21 22 /** 23 * 该函数有两个功能 24 * 1. 首先把一个正常的中缀表达式,转化为一个后缀表达式 25 * 2. 通过后缀表达式计算表达式的值 26 * @param length 27 * @param expretion 28 * @return 29 */ 30 private static int compute(int length, String expretion) { 31 int result = 0; 32 List<Character> oneOps = new LinkedList<>(); 33 oneOps.add(‘+‘); 34 oneOps.add(‘-‘); 35 LinkedList<Character> ops = new LinkedList<>(); //用作栈,前面一定也要是LinkedList 36 StringBuffer changedExp = new StringBuffer(); 37 for(int i = 0; i < length; i++){ 38 Character temp = expretion.charAt(i); 39 if(temp >= ‘0‘ && temp <= ‘9‘) 40 changedExp.append(temp); 41 else{ 42 if(ops.isEmpty()) 43 ops.push(temp); 44 else{ 45 if(temp == ‘(‘) 46 ops.push(temp); 47 else{ 48 if(oneOps.contains(temp)){ 49 // if(ops.peek() != ‘(‘) 50 //原来用的if,考虑在遇到+-的时候应该把栈里的运算法都pop出来,现在改用while 51 while(!ops.isEmpty()){ 52 if(ops.peek() == ‘(‘) 53 break; 54 changedExp.append(ops.pop()); 55 } 56 ops.push(temp); 57 } 58 else if(temp != ‘)‘){ 59 ops.push(temp); 60 } 61 else{ //‘)‘的情况 62 while(ops.peek() != ‘(‘){ 63 changedExp.append(ops.pop()); 64 } 65 ops.pop(); 66 } 67 } 68 } 69 } 70 } 71 while(!ops.isEmpty()){ 72 changedExp.append(ops.pop()); 73 } 74 String changedExpStr = changedExp.toString(); 75 System.out.println(changedExpStr); //输出转化后的后缀表达式 76 77 //用后缀表达式计算 78 LinkedList<Integer> nums = new LinkedList<>(); 79 for(int i = 0; i < changedExpStr.length(); i++){ 80 Character temp = changedExpStr.charAt(i); 81 if(temp >= ‘0‘ && temp <= ‘9‘){ 82 nums.push(temp-‘0‘); 83 } 84 else{ 85 int a = nums.pop(); 86 int b = nums.pop(); 87 switch(temp){ 88 case ‘+‘: nums.push(a+b); break; 89 case ‘-‘: nums.push(b-a); break; 90 case ‘*‘: nums.push(a*b); break; 91 case ‘/‘: nums.push(b/a); break; 92 } 93 } 94 } 95 result = nums.pop(); 96 return result; 97 } 98 99 }
时间: 2024-10-29 19:10:21