码迷,mamicode.com
首页 > 其他好文 > 详细

【编程题】简单的四则运算

时间:2016-08-10 00:42:59      阅读:225      评论:0      收藏:0      [点我收藏+]

标签:

问题描述: 输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值
注: 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 }

 

【编程题】简单的四则运算

标签:

原文地址:http://www.cnblogs.com/focusonepoint/p/5755117.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!