| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 | 
							- import (
 
- 	"strings"
 
- 	"strconv"
 
- )
 
- func calculate(s string) int {
 
- 	s = strings.Replace(s, " ", "", -1)
 
- 	nums := make([]int, 0)
 
- 	ops := make([]byte, 0)
 
- 	l, m, n := len(s), 0, 0
 
- 	beg := -1
 
- 	push := false
 
- 	for i := 0; i < l; i++ {
 
- 		switch s[i] {
 
- 		case '+', '-':
 
- 			var num int
 
- 			if beg != -1 {
 
- 				num = atoi(s, beg, i)
 
- 				beg = -1
 
- 			} else {
 
- 				num = nums[n-1]
 
- 				nums = nums[:n-1]
 
- 				n--
 
- 			}
 
- 			if !push && m != 0 { // Pop
 
- 				aopb(&nums[n-1], ops[m-1], num)
 
- 				ops = ops[:m-1]
 
- 				m--
 
- 			} else {
 
- 				nums = append(nums, num)
 
- 				n++
 
- 				push = false
 
- 			}
 
- 			ops = append(ops, s[i])
 
- 			m++
 
- 		case '(':
 
- 			push = true
 
- 		case ')':
 
- 			var num int
 
- 			if beg != -1 {
 
- 				num = atoi(s, beg, i)
 
- 				beg = -1
 
- 			} else {
 
- 				num = nums[n-1]
 
- 				nums = nums[:n-1]
 
- 				n--
 
- 			}
 
- 			if m != 0 { // Handle expressions like (num)
 
- 				aopb(&nums[n-1], ops[m-1], num)
 
- 				ops = ops[:m-1]
 
- 				m--
 
- 			} else {
 
- 				nums = append(nums, num)
 
- 				n++
 
- 			}
 
- 		default: // Case '0', '1', ... , '9'
 
- 			if beg == -1 {
 
- 				beg = i
 
- 			}
 
- 		}
 
- 	}
 
- 	if beg != -1 {
 
- 		nums = append(nums, atoi(s, beg, l))
 
- 	}
 
- 	if len(ops) != 0 {
 
- 		aopb(&nums[0], ops[0], nums[1])
 
- 	}
 
- 	return nums[0]
 
- }
 
- func atoi(s string, beg, end int) int {
 
- 	i, _ := strconv.Atoi(s[beg:end])
 
- 	return i
 
- }
 
- func aopb(a *int, op byte, b int) {
 
- 	switch op {
 
- 	case '+': *a += b
 
- 	case '-': *a -= b
 
- 	}
 
- }
 
 
  |