NC137 表达式求值
描述
请写一个整数计算器,支持加减乘三种运算和括号。
示例1
输入:
“1+2”
复制
返回值:
3
复制
示例2
输入:
“(2*(3-4))5"
复制
返回值:
-10
复制
示例3
输入:
"3+23*4-1”
复制
返回值:
26
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 返回表达式的值
* @param s string字符串 待计算的表达式
* @return int整型
*/
public int solve (String s) {
// write code here
Stack<Integer> nums = new Stack<>();
Stack<Character> ops = new Stack<>();
Map<Character , Integer> map = new HashMap<>();
map.put('+' , 1) ;
map.put('-' , 1) ;
map.put('*' , 2) ;
for(int i = 0 ; i < s.length() ; i++){
char curt = s.charAt(i) ;
if(Character.isDigit(curt)){
String num = String.valueOf(curt) ;
while(++i < s.length()){
char temp = s.charAt(i);
if(Character.isDigit(temp)){
num += temp ;
}else{
break ;
}
//i++ ;
}
nums.push(Integer.valueOf(num)) ;
i-- ;
continue ;
}
if(ops.isEmpty()){
ops.push(curt) ;
continue ;
}
if(curt == '('){
ops.push(curt) ;
continue ;
}
if(curt == ')'){
while(ops.peek() != '('){
char ope = ops.pop();
cal(nums , ope) ;
}
ops.pop() ;
continue ;
}
while(!ops.isEmpty() && (map.getOrDefault(ops.peek(), 0) >= map.get(curt))){
char lastop = ops.peek() ;
ops.pop();
cal(nums , lastop) ;
}
ops.push(curt) ;
}
while(!ops.isEmpty()){
cal(nums , ops.pop()) ;
}
return nums.pop() ;
}
public void cal(Stack<Integer> nums , char lastop){
int num1 = nums.pop() ;
int num2 = nums.pop();
int ans = 0 ;
if(lastop == '*'){
ans = num1 * num2 ;
}
if(lastop == '+'){
ans = num1 + num2 ;
}
if(lastop == '-'){
ans = num2 - num1 ;
}
nums.push(ans) ;
}
}