鱼C论坛

 找回密码
 立即注册
查看: 391|回复: 1

[已解决]表达式求值问题

[复制链接]
发表于 2024-11-1 17:25:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在一个表达式中,只有“(”,“)”,“0-9”,“+”,“-”,“*”,“/”,“^”,请求出表达式的值。(“/”用整数除法)。

输入格式:
共1 行,为一个算式。 (算式长度<=30 其中所有数据在 0~2^31-1的范围内)。

输出格式:
共一行,为表达式的值。

输入样例:
在这里给出一组输入。例如:

1+(3+2)*(7^2+6*9)/(2)
输出样例:
在这里给出相应的输出。例如:

258

这题用C或者C++怎么做
最佳答案
2024-11-1 17:58:32
要解决这个表达式求值问题,可以使用“逆波兰表达式”(RPN)或“中缀表达式转后缀表达式”的方法。以下是一个简单的思路:

1. **将中缀表达式转换为后缀表达式**:使用栈来处理运算符的优先级和括号。
2. **计算后缀表达式的值**:再次使用栈来计算后缀表达式的结果。

以下是实现这个过程的Python代码:

  1. def precedence(op):
  2.     if op == '+' or op == '-':
  3.         return 1
  4.     if op == '*' or op == '/':
  5.         return 2
  6.     if op == '^':
  7.         return 3
  8.     return 0

  9. def apply_op(a, b, op):
  10.     if op == '+': return a + b
  11.     if op == '-': return a - b
  12.     if op == '*': return a * b
  13.     if op == '/': return a // b
  14.     if op == '^': return a ** b

  15. def evaluate(expression):
  16.     values = []
  17.     ops = []
  18.     i = 0
  19.     while i < len(expression):
  20.         if expression[i] == ' ':
  21.             i += 1
  22.             continue
  23.         elif expression[i] == '(':
  24.             ops.append(expression[i])
  25.         elif expression[i].isdigit():
  26.             val = 0
  27.             while i < len(expression) and expression[i].isdigit():
  28.                 val = (val * 10) + int(expression[i])
  29.                 i += 1
  30.             values.append(val)
  31.             i -= 1
  32.         elif expression[i] == ')':
  33.             while len(ops) != 0 and ops[-1] != '(':
  34.                 val2 = values.pop()
  35.                 val1 = values.pop()
  36.                 op = ops.pop()
  37.                 values.append(apply_op(val1, val2, op))
  38.             ops.pop()
  39.         else:
  40.             while (len(ops) != 0 and precedence(ops[-1]) >= precedence(expression[i])):
  41.                 val2 = values.pop()
  42.                 val1 = values.pop()
  43.                 op = ops.pop()
  44.                 values.append(apply_op(val1, val2, op))
  45.             ops.append(expression[i])
  46.         i += 1

  47.     while len(ops) != 0:
  48.         val2 = values.pop()
  49.         val1 = values.pop()
  50.         op = ops.pop()
  51.         values.append(apply_op(val1, val2, op))

  52.     return values[-1]

  53. # 示例
  54. expression = "3 + 5 * (2 - 8)"
  55. result = evaluate(expression)
  56. print(result)
复制代码


这个代码会计算给定的算术表达式,并返回其结果。请注意,代码中使用了整数除法(`//`),以符合题目要求。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-11-1 17:58:32 | 显示全部楼层    本楼为最佳答案   
要解决这个表达式求值问题,可以使用“逆波兰表达式”(RPN)或“中缀表达式转后缀表达式”的方法。以下是一个简单的思路:

1. **将中缀表达式转换为后缀表达式**:使用栈来处理运算符的优先级和括号。
2. **计算后缀表达式的值**:再次使用栈来计算后缀表达式的结果。

以下是实现这个过程的Python代码:

  1. def precedence(op):
  2.     if op == '+' or op == '-':
  3.         return 1
  4.     if op == '*' or op == '/':
  5.         return 2
  6.     if op == '^':
  7.         return 3
  8.     return 0

  9. def apply_op(a, b, op):
  10.     if op == '+': return a + b
  11.     if op == '-': return a - b
  12.     if op == '*': return a * b
  13.     if op == '/': return a // b
  14.     if op == '^': return a ** b

  15. def evaluate(expression):
  16.     values = []
  17.     ops = []
  18.     i = 0
  19.     while i < len(expression):
  20.         if expression[i] == ' ':
  21.             i += 1
  22.             continue
  23.         elif expression[i] == '(':
  24.             ops.append(expression[i])
  25.         elif expression[i].isdigit():
  26.             val = 0
  27.             while i < len(expression) and expression[i].isdigit():
  28.                 val = (val * 10) + int(expression[i])
  29.                 i += 1
  30.             values.append(val)
  31.             i -= 1
  32.         elif expression[i] == ')':
  33.             while len(ops) != 0 and ops[-1] != '(':
  34.                 val2 = values.pop()
  35.                 val1 = values.pop()
  36.                 op = ops.pop()
  37.                 values.append(apply_op(val1, val2, op))
  38.             ops.pop()
  39.         else:
  40.             while (len(ops) != 0 and precedence(ops[-1]) >= precedence(expression[i])):
  41.                 val2 = values.pop()
  42.                 val1 = values.pop()
  43.                 op = ops.pop()
  44.                 values.append(apply_op(val1, val2, op))
  45.             ops.append(expression[i])
  46.         i += 1

  47.     while len(ops) != 0:
  48.         val2 = values.pop()
  49.         val1 = values.pop()
  50.         op = ops.pop()
  51.         values.append(apply_op(val1, val2, op))

  52.     return values[-1]

  53. # 示例
  54. expression = "3 + 5 * (2 - 8)"
  55. result = evaluate(expression)
  56. print(result)
复制代码


这个代码会计算给定的算术表达式,并返回其结果。请注意,代码中使用了整数除法(`//`),以符合题目要求。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-10 00:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表