java题目 表达式求值
描述
给定一个字符串描述的算术表达式,计算出结果值。
输入字符串长度不超过 100 ,合法的字符包括 ”+, -, *, /, (, )” , ”0-9” 。
数据范围:运算过程中和最终结果均满足 |val| \le 2^{31}-1 \∣val∣≤231−1 ,即只进行整型运算,确保输入的表达式合法
输入描述:
输入算术表达式
输出描述:
计算出结果值
示例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 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人