Вопрос пользователя:
Ответ нейросети:
package main
import ( "fmt" "strconv" "strings" )
func Calc(expression string) (float64, error) { // Проверяем, что выражение не пустое if expression == "" { return 0, fmt.Errorf("Empty expression") }
// Преобразуем выражение в массив символов
tokens := strings.Fields(expression)
// Преобразуем массив символов в обратную польскую запись
postfix, err := infixToPostfix(tokens)
if err != nil {
return 0, err
}
// Вычисляем результат выражения
result, err := evaluatePostfix(postfix)
if err != nil {
return 0, err
}
return result, nil
}
func infixToPostfix(tokens []string) ([]string, error) { var postfix []string var stack []string
precedence := map[string]int{
"(": 0,
"+": 1,
"-": 1,
"*": 2,
"/": 2,
}
for _, token := range tokens {
if isNumber(token) {
postfix = append(postfix, token)
} else if token == "(" {
stack = append(stack, token)
} else if token == ")" {
for len(stack) > 0 && stack[len(stack)-1] != "(" {
postfix = append(postfix, stack[len(stack)-1])
stack = stack[:len(stack)-1]
}
if len(stack) == 0 {
return nil, fmt.Errorf("Mismatched parentheses")
}
stack = stack[:len(stack)-1]
} else {
for len(stack) > 0 && precedence[stack[len(stack)-1]] >= precedence[token] {
postfix = append(postfix, stack[len(stack)-1])
stack = stack[:len(stack)-1]
}
stack = append(stack, token)
}
}
for len(stack) > 0 {
if stack[len(stack)-1] == "(" {
return nil, fmt.Errorf("Mismatched parentheses")
}
postfix = append(postfix, stack[len(stack)-1])
stack = stack[:len(stack)-1]
}
return postfix, nil
}
func evaluatePostfix(postfix []string) (float64, error) { var stack []float64
for _, token := range postfix {
if isNumber(token) {
num, err := strconv.ParseFloat(token, 64)
if err != nil {
return 0, fmt.Errorf("Invalid number: %s", token)
}
stack = append(stack, num)
} else {
if len(stack) < 2 {
return 0, fmt.Errorf("Invalid expression")
}
num2 := stack[len(stack)-1]
num1 := stack[len(stack)-2]
stack = stack[:len(stack)-2]
switch token {
case "+":
stack = append(stack, num1+num2)
case "-":
stack = append(stack, num1-num2)
case "*":
stack = append(stack, num1*num2)
case "/":
if num2 == 0 {
return 0, fmt.Errorf("Division by zero")
}
stack = append(stack, num1/num2)
}
}
}
if len(stack) != 1 {
return 0, fmt.Errorf("Invalid expression")
}
return stack[0], nil
}
func isNumber(token string) bool { _, err := strconv.ParseFloat(token, 64) return err == nil }
func main() { result, err := Calc("3 + 4 * 2 / (1 - 5)^2") if err != nil { fmt.Println("Error:", err) } else { fmt.Println("Result:", result) } }
Напишите нам, если в вопросе есть ваши персональные данные ([email protected])
Обратите внимание: ответы, предоставляемые искусственным интеллектом, могут не всегда быть точными. Не рассчитывайте на них в критически важных областях, таких как медицина, юриспруденция, финансы или в вопросах, связанных с безопасностью. Для важных решений всегда обращайтесь к квалифицированным специалистам. Администрация сайта не несет ответственности за контент, сгенерированный автоматически.