// convert2postfix converts an infix expression to postfix func convert2postfix(tokens []string) []string { var stack stack.Stack var result []string for _, token := range tokens { if isOperator(token) { OPERATOR: for { top, err := stack.Top() if err == nil && top != "(" { if opGTE(top.(string), token) { pop, _ := stack.Pop() result = append(result, pop.(string)) } else { break OPERATOR } } break OPERATOR } stack.Push(token) } else if token == "(" { stack.Push(token) } else if token == ")" { PAREN: for { top, err := stack.Top() if err == nil && top != "(" { pop, _ := stack.Pop() result = append(result, pop.(string)) } else { stack.Pop() // pop off "(" break PAREN } } } else if isOperand(token) { result = append(result, token) } } for !stack.IsEmpty() { pop, _ := stack.Pop() result = append(result, pop.(string)) } return result }