package main

import (
    "fmt"
	"strconv"
	"unicode"
)

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 返回表达式的值
 * @param s string字符串 待计算的表达式
 * @return int整型
 */
func solve(s string) int {
	s = "(" + s + ")"
	var op []rune
	var nums []int

	for i := 0; i < len(s); i++ {
		if unicode.IsNumber(rune(s[i])) {
			pos := i
			for pos < len(s) && unicode.IsNumber(rune(s[pos])) {
				pos++
			}
			num, _ := strconv.Atoi(s[i:pos])
			nums = append(nums, num)
			i = pos - 1
		} else {
			if s[i] == ')' {
				for len(op) > 0 && op[len(op)-1] != '(' {
					a, b := nums[len(nums)-2], nums[len(nums)-1]
					nums = nums[:len(nums)-2]
					operate := op[len(op)-1]
					op = op[:len(op)-1]
					rst := figure(a, b, operate)
					nums = append(nums, rst)
				}
                op = op[:len(op)-1]
			} else {
				for len(op) > 0 && check(op[len(op)-1], rune(s[i])) {
					a, b := nums[len(nums)-2], nums[len(nums)-1]
					nums = nums[:len(nums)-2]
					operate := op[len(op)-1]
					op = op[:len(op)-1]
					rst := figure(a, b, operate)
					nums = append(nums, rst)
				}
                op = append(op, rune(s[i]))
			}
		}
	}
	return nums[0]
}

func check(pre, cur rune) bool {
    if pre == '(' || pre == ')' || cur == '(' || cur == ')' {
        return false
    }
	if cur != '*' {
		return true
	} else if pre == '*' && cur == '*' {
        return true
    }
	return false
}

func figure(a, b int, op rune) int {
	switch op {
	case '+':
		return a + b
	case '-':
		return a - b
	case '*':
		return a * b
	case '/':
		return a / b
	}
	return 0
}