华为上机测试题(表达式运算-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 }

 

你可能感兴趣的:(java)