首页 > 学院 > 开发设计 > 正文

华为上机测试题(表达式运算-java)

2019-11-14 21:12:58
字体:
来源:转载
供稿:网友
华为上机测试题(表达式运算-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 }


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表