华为上机测试题(表达式运算-java)
PS:自己写的,自测试OK,供大家参考。
补充:数据解析的过程,评论区有更好的处理方式,可参考。
/*
* 输入一个表达式,3*8+7-2,没有括号 输出结果
*/
/* 本程序暂不考虑容错处理 */
1 import java.util.Scanner; 2 3 public class Calculator { 4 5 /* 例如:表达式 3*8+7-2中,dataNum=4,opNum=3 */ 6 private static int daNum = 0; //表达式中数据个数 7 private static int opNum = 0; //表达式中运算符个数 8 9 public static void main(String[] args) { 10 11 System.out.println("请输入运算表达式(例如:3*8+7-2):"); 12 Scanner s = new Scanner(System.in); 13 //String str = s.nextLine().toString(); 14 char[] ch = s.nextLine().toCharArray(); 15 s.close(); 16 StringBuffer sbOP = new StringBuffer(); 17 StringBuffer sbDA = new StringBuffer(); 18 19 int dataIndex = 0; 20 int[] data = new int[32]; // 限定能处理的最大数据个数为32 21 22 for(int i = 0; i < ch.length; i++) 23 { 24 if(('+' == ch[i])||('-' == ch[i])||('*' == ch[i])||('/' == ch[i])) 25 { 26 sbOP.append(ch[i]); 27 opNum++; 28 for(int j = dataIndex; j < i; j++) 29 { 30 sbDA.append(ch[j]); 31 } 32 data[daNum++] = Integer.parseInt(sbDA.toString()); 33 sbDA.delete(0, sbDA.length()); //清空sbDA 34 dataIndex = i+1; 35 } 36 } 37 for(int j = dataIndex; j < ch.length; j++) 38 { 39 sbDA.append(ch[j]); 40 } 41 data[daNum++] = Integer.parseInt(sbDA.toString()); 42 int[] da = new int[daNum]; //数值数组 43 for(int i = 0; i < daNum; i++) 44 { 45 da[i] = data[i]; 46 //System.out.println("da:"+da[i]); 47 } 48 char[] op = sbOP.toString().toCharArray(); //运算符数组 49 50 System.out.println("="+cal(da, op)); 51 } 52 53 private static int cal(int[] da, char[] op) { 54 55 if(1 == daNum) 56 { 57 return da[0]; 58 } 59 60 // 初始化 标示所以da值都是有效的 61 boolean[] flag = new boolean[daNum]; 62 for(int i = 0; i < daNum; i++) 63 { 64 flag[i] = true; 65 } 66 67 while(1 != daNum) 68 { 69 // 乘除运算 70 for(int i = 0; i < opNum; i++) 71 { 72 if('*' == op[i]) 73 { 74 da[i+1] = da[i] * da[i+1]; 75 flag[i] = false; 76 daNum--; 77 } 78 if('/' == op[i]) 79 { 80 da[i+1] = da[i] / da[i+1]; 81 flag[i] = false; 82 daNum--; 83 } 84 } 85 86 // 加减运算 87 int index = 0; 88 for(int i = 0; i < opNum; i++) 89 { 90 index = i+1; 91 if('+' == op[i]) 92 { 93 while(!flag[index]) 94 { 95 index++; 96 } 97 da[index] = da[i] + da[index]; 98 flag[i] = false; 99 daNum--; 100 } 101 if('-' == op[i]) 102 { 103 while(!flag[index]) 104 { 105 index++; 106 } 107 da[index] = da[i] - da[index]; 108 flag[i] = false; 109 daNum--; 110 } 111 } 112 } 113 114 return da[opNum]; 115 } 116 }