| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 | import (	"strconv"	"strings")func calculate(s string) int {	none := struct{}{}	opsSet := map[byte]struct{}{'+': none, '-': none, '*': none, '/': none}	ops := make([]byte, 0)	nums := make([]int, 0)	prev := -1	for i := range s {		if _, ok := opsSet[s[i]]; ok {			num, _ := strconv.Atoi(strings.Trim(s[prev+1:i], " ")) // Atoi should trim all spaces of string			mulOrDiv(&nums, &ops, &num)			nums = append(nums, num)			ops = append(ops, s[i])			prev = i		}	}	num, _ := strconv.Atoi(strings.Trim(s[prev+1:], " "))	mulOrDiv(&nums, &ops, &num)	nums = append(nums, num)	for left, right := 0, len(nums)-1; left < right; left, right = left+1, right-1 {		nums[left], nums[right] = nums[right], nums[left]	} // Reverse nums and ops	for left, right := 0, len(ops)-1; left < right; left, right = left+1, right-1 {		ops[left], ops[right] = ops[right], ops[left]	}	for l1, l2 := len(nums), len(ops); l1 != 1; l1, l2 = l1-1, l2-1 {		op := ops[l2-1]		ops = ops[:l2-1]		n1, n2 := nums[l1-2], nums[l1-1]		nums = nums[:l1-2]		switch op {		case '+':			nums = append(nums, n2+n1)		case '-':			nums = append(nums, n2-n1)		}	}	return nums[0]}func mulOrDiv(nums *[]int, ops *[]byte, num *int) {	if l := len(*ops); l != 0 && ((*ops)[l-1] == '*' || (*ops)[l-1] == '/') {		n := (*nums)[len(*nums)-1]		*nums = (*nums)[:len(*nums)-1]		switch (*ops)[l-1] {		case '*':			*num = n * (*num)		case '/':			*num = n / (*num)		}		*ops = (*ops)[:l-1]	}}
 |