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'
}