示例#1
0
func convert2postfix(tokens []string) []string {
	var stack util.Stack
	var result []string
	for _, token := range tokens {
		if isOperator(token) {
		OPERATOR:
			for {
				top, err := stack.Top()
				if err != nil || top == "(" {
					break OPERATOR
				}
				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 == ")" {
		CLOSE_PAREN:
			for {
				top, err := stack.Top()
				if err != nil || top == "(" {
					stack.Pop() // pop off "("
					break CLOSE_PAREN
				} else {
					pop, _ := stack.Pop()
					result = append(result, pop.(string))
				}
			}
		} else if isOperand(token) {
			result = append(result, token)
		}
	}

	for !stack.IsEmpty() {
		pop, _ := stack.Pop()
		result = append(result, pop.(string))
	}

	return result
}