java题目 表达式求值

描述

给定一个字符串描述的算术表达式,计算出结果值。

输入字符串长度不超过 100 ,合法的字符包括 ”+, -, *, /, (, )” , ”0-9” 。
 
数据范围:运算过程中和最终结果均满足 |val| \le 2^{31}-1 \val2311  ,即只进行整型运算,确保输入的表达式合法

输入描述:

输入算术表达式

输出描述:

计算出结果值

示例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 }

 

posted @ 2022-03-17 18:40  海漠  阅读(469)  评论(0编辑  收藏  举报