题目描述
给定一个字符串str,str表示一个公式,公式里可以有整数,加减乘除和左右括号,返回公式的计算结果(注意:题目中所有运算都是整型运算,向下取整,且保证数据合法,不会出现除0等情况)。
输入描述:
输出一行字符串,代表str(保证str计算的结果不会出现除零,int溢出等情况)。
输出描述:
输出一个整数,代表表达式的计算结果。
示例1
输入
48*((70-65)-43)+8*1
输出
-1816
示例2
输入
3+1*4
输出
7
解法一:递归
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args)throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
int res = value(s.toCharArray(),0)[0];
System.out.println(res);
}
public static int[] value(char[] arr,int i){
Deque<String> q = new LinkedList<>();
int pre = 0;
while(i<arr.length&&arr[i]!=')'){
if(arr[i]>='0'&&arr[i]<='9'){
pre = pre*10+arr[i++]-'0';
}else if(arr[i]!='('){
addNum(q,pre);
q.addLast(String.valueOf(arr[i++]));
pre = 0;
}else{
int[] tmp = value(arr,i+1);
pre = tmp[0];
i = tmp[1]+1;
}
}
addNum(q,pre);
int res = getRes(q);
return new int[]{res,i};
}
public static void addNum(Deque<String> q,int num){
if(!q.isEmpty()){
String c = q.pollLast();
if(c.equals("+")||c.equals("-")){
q.addLast(c);
}else{
int prenum = Integer.parseInt(q.pollLast());
num = c.equals("*")?num*prenum:prenum/num;
}
}
q.addLast(String.valueOf(num));
}
public static int getRes(Deque<String> q){
int res = 0;
boolean add = true;
while(!q.isEmpty()){
String cur = q.pollFirst();
if(cur.equals("+")){
add = true;
}else if(cur.equals("-")){
add = false;
}else{
res += add?Integer.parseInt(cur):-Integer.parseInt(cur);
}
}
return res;
}
}