描述
给定一个字符串描述的算术表达式,计算出结果值。
输入字符串长度不超过 100 ,合法的字符包括 ”+, -, *, /, (, )” , ”0-9” 。
数据范围:运算过程中和最终结果均满足
输入描述:
输入算术表达式
输出描述:
计算出结果值
示例1
输入:
400+5
复制
输出:
405
1 import java.util.*;
2 public class Main{
3 public static void main(String[] args){
4 Scanner sc=new Scanner(System.in);
5 String s=sc.nextLine();
6 //将其他括号,替换成小括号
7 s=s.replace("{","(");
8 s=s.replace("[","(");
9 s=s.replace("}",")");
10 s=s.replace("]",")");
11 System.out.println(slove(s));
12 }
13 public static int slove(String s){
14 Stack<Integer> stack=new Stack<>();
15 int n=s.length();
16 char[] chs=s.toCharArray();
17 int index=0;
18 //初始化符号为'+'
19 char sign='+';
20 //记录数字
21 int number=0;
22
23 //处理表达式
24 for(int i=0; i<n; i++){
25 char ch = chs[i];
26 //遇到空格跳过
27 if(ch ==' ') continue;
28 //如果是数字,拼接数字
29 if(Character.isDigit(ch)) {
30 number = number *10 + ch-'0';
31 }
32 //如果是小括号
33 if(ch == '(') {
34 //移动到括号后一位
35 int j = i+1;
36 //统计括号数
37 int count =1;
38 while(count>0) { //统计当前(开始包含的表达式,直到对应的)停止
39 if(chs[j] == ')') count--; //右括号+1
40 if(chs[j] == '(') count++; //左括号-1
41 j++;
42 }
43 //统计完后要计算括号内的表达式,递归计算
44 number = slove(s.substring(i+1, j-1));
45 i = j-1; //更新下标
46 }
47 //遇到符号或者最后一位了
48 if(!Character.isDigit(ch) || i == n-1) {
49 if(sign == '+') {
50 stack.push(number);
51 } else if(sign == '-') {
52 stack.push(-1 * number);
53 } else if(sign == '*') {
54 stack.push(stack.pop() * number);
55 } else if(sign == '/') {
56 stack.push(stack.pop() / number);
57 }
58 sign = ch; //更新符号
59 number =0; //刷新数字
60 }
61 }
62
63 //栈中数字求和得到结果
64 int ans=0;
65 while(!stack.isEmpty()){
66 ans = ans + stack.pop();
67 }
68 return ans;
69 }
70 }