package main
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 返回表达式的值
* @param s string字符串 待计算的表达式
* @return int整型
*/
func solve( s string ) int {
if s[0]=='-'{
s="0"+s
}
opMap:=map[byte]int{'-':1,'+':1,'(':1,'*':2}
nums:=[]int{}
ops:=[]byte{}
for i:=0;i<len(s);i++{
if s[i]=='('{
ops=append(ops,s[i])
}else if s[i]==')'{
for len(ops)!=0{
if ops[len(ops)-1]!='('{
calc(&nums, &ops)
}else{
ops=ops[:len(ops)-1]
break
}
}
}else if _,ok:=opMap[s[i]];ok{
for len(ops)>0&&opMap[ops[len(ops)-1]]>opMap[s[i]] {
calc(&nums, &ops)
}
ops=append(ops, s[i])
}else if isNum(s[i]){
n:=0
for ;i<len(s);i++{
if isNum(s[i]){
n=n*10+int(s[i]-'0')
}else{
i--
break
}
}
nums=append(nums, n)
}
}
for len(nums)>1{
calc(&nums, &ops)
}
if len(nums)==1{
return nums[0]
}else{
return 0
}
}
func calc(nums *[]int,ops *[]byte){
numsTmp:=*nums
a:=numsTmp[len(numsTmp)-2]
b:=numsTmp[len(numsTmp)-1]
*nums=numsTmp[:len(numsTmp)-2]
opsTmp:=*ops
op:=opsTmp[len(opsTmp)-1]
*ops=opsTmp[:len(opsTmp)-1]
if len(*ops)>0&&opsTmp[len(opsTmp)-2]=='-'{
if op=='-'{
op='+'
}else if op=='+'{
op='-'
}
}
if op=='+'{
*nums=append(*nums, a+b)
}else if op=='-'{
*nums=append(*nums, a-b)
}else if op=='*'{
*nums=append(*nums, a*b)
}
}
func isNum(n byte)bool{
return n>='0'&&n<='9'
}