华为上机测试题(表达式运算-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 }
原文地址:https://www.cnblogs.com/lr-ting/p/3992487.html