Вопрос пользователя:
Ответ нейросети:
package main
import ( "errors" "strconv" "strings" )
func Calc(expression string) (float64, error) { expression = strings.ReplaceAll(expression, " ", "") // удаление пробелов из выражения stackNum := []float64{} stackOp := []rune{}
for i := 0; i < len(expression); i++ {
if expression[i] == '(' {
stackOp = append(stackOp, '(')
} else if expression[i] == ')' {
for len(stackOp) > 0 && stackOp[len(stackOp)-1] != '(' {
if err := performOperation(&stackNum, &stackOp); err != nil {
return 0, err
}
}
if len(stackOp) == 0 {
return 0, errors.New("Invalid expression")
}
stackOp = stackOp[:len(stackOp)-1]
} else if expression[i] == '+' || expression[i] == '-' || expression[i] == '*' || expression[i] == '/' {
for len(stackOp) > 0 && precedence(stackOp[len(stackOp)-1]) >= precedence(rune(expression[i])) {
if err := performOperation(&stackNum, &stackOp); err != nil {
return 0, err
}
}
stackOp = append(stackOp, rune(expression[i]))
} else {
numStr := ""
for i < len(expression) && (expression[i] >= '0' && expression[i] <= '9' || expression[i] == '.') {
numStr += string(expression[i])
i++
}
i--
num, err := strconv.ParseFloat(numStr, 64)
if err != nil {
return 0, errors.New("Invalid expression")
}
stackNum = append(stackNum, num)
}
}
for len(stackOp) > 0 {
if err := performOperation(&stackNum, &stackOp); err != nil {
return 0, err
}
}
if len(stackNum) != 1 || len(stackOp) != 0 {
return 0, errors.New("Invalid expression")
}
return stackNum[0], nil
}
func precedence(op rune) int { if op == '+' || op == '-' { return 1 } else if op == '*' || op == '/' { return 2 } return 0 }
func performOperation(stackNum *[]float64, stackOp *[]rune) error { if len(*stackNum) < 2 { return errors.New("Invalid expression") }
num2 := (*stackNum)[len(*stackNum)-1]
num1 := (*stackNum)[len(*stackNum)-2]
*stackNum = (*stackNum)[:len(*stackNum)-2]
op := (*stackOp)[len(*stackOp)-1]
*stackOp = (*stackOp)[:len(*stackOp)-1]
var result float64
switch op {
case '+':
result = num1 + num2
case '-':
result = num1 - num2
case '*':
result = num1 * num2
case '/':
if num2 == 0 {
return errors.New("Division by zero")
}
result = num1 / num2
}
*stackNum = append(*stackNum, result)
return nil
}
Напишите нам, если в вопросе есть ваши персональные данные ([email protected])
Обратите внимание: ответы, предоставляемые искусственным интеллектом, могут не всегда быть точными. Не рассчитывайте на них в критически важных областях, таких как медицина, юриспруденция, финансы или в вопросах, связанных с безопасностью. Для важных решений всегда обращайтесь к квалифицированным специалистам. Администрация сайта не несет ответственности за контент, сгенерированный автоматически.