技巧:
    递归顺序    10进制    快速幂
思路:
    1. 可能出现多余的括号 但是不会出现错误的括号. 例如
    ---多余的括号---  
    a:  ((1 + 1)        ||         ((1 + 1))))
    b: ((((1 + 1))))
    c: 1 + (1
    ---错误的括号---
    a: 1 + )1 

    2. (关于运算顺序和办法)运算符优先顺序 由低到高排序为 (+,-) (* /)  ^
    由于递归特性 如果表达式中运算符存在的情况下 。例如扫到了+和*  我们要先算加法。原因是最先进入递归的最后才能返回-对应上了优先度.
    
    3. (关于多余括号的处理和一些其他情况)
    case1 (1 + 1)  或 (1 + 1 或 1 + 1)          ======> 由于cnt 不可能是0 所以在这里需要按照情况拿掉多余的括号再次调用递归函数
    case2  123456                                        ======>  纯数字的话直接返回即可                               

实现:
package main

import (
    .    "fmt"
    "io"
    "bufio"
    "os"
    "math"
)
// a 的 b次方
func power(a, b int) int {
    return int(math.Pow(float64(a),float64(b)))
}

func number(s string, l, r int) int {
    ans := 0
    for i := 0; r - i >= l; i++ {
        ans += int(s[r - i] - '0') * power(10, i)
    }
    return ans
}

func cale(s string, l, r int) int {
    var cnt, opt1, opt2, opt3 int
    for i := l; i <= r; i ++{
        if s[i] == '(' {
            cnt++
        }else if s[i] == ')' {
            cnt --
        }else if cnt == 0  {
            if s[i] == '+' || s[i] == '-' {
                opt1 = i
            }else if s[i] == '*' || s[i] == '/' {
                opt2 = i
            }else if s[i] == '^' {
                opt3 = i
            }
        }
    } 
    // 排除多余的括号
    if cnt > 0 && s[l] == '(' {
        return cale(s, l + 1, r) 
    }else if cnt < 0 && s[r] == ')' {
        return cale(s, l, r - 1) 
    }else if (opt1 | opt2 | opt3) == 0 {// 无运算符
        // 拿掉括号
        if s[l] == '(' && s[r] == ')' {
            return cale(s, l + 1, r - 1) 
        }
        return number(s, l, r)
    }
    
    // 递归求解
    if opt1 > 0 {
        if s[opt1] == '+' {
            return cale(s, l, opt1 - 1) + cale(s, opt1 + 1, r)
        }
        return cale(s, l, opt1 - 1) - cale(s, opt1 + 1, r)
    }else if opt2 > 0 {
        if s[opt2] == '*' {
            return cale(s, l, opt2 - 1) * cale(s, opt2 + 1, r)
        }
        return cale(s, l, opt2 - 1) / cale(s, opt2 + 1, r)
    }else {
        return power(cale(s, l, opt3 - 1), cale(s, opt3 + 1, r))
    }
}

// https://ac.nowcoder.com/acm/problem/50999
func NC50999(_r io.Reader, _w io.Writer) {
    in, out := bufio.NewReader(_r), bufio.NewWriter(_w)
    defer out.Flush()
    var s string
    Fscan(in, &s)
    Fprintln(out, cale(s, 0, len(s) - 1))
}

func main() {
    NC50999(os.Stdin, os.Stdout)
}