鱼C论坛

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

[已解决]表达式求值

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

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

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

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

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

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

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

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

258

这题的C或者C++代码怎么实现
最佳答案
2024-11-1 17:47:34
要计算一个包含括号和基本运算符的表达式的值,你可以使用“逆波兰表达式”(RPN)或“中缀表达式转后缀表达式”的方法。以下是一个简单的思路:

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

以下是实现这个过程的Python代码:
def precedence(op):
    if op == '+' or op == '-':
        return 1
    if op == '*' or op == '/':
        return 2
    if op == '^':
        return 3
    return 0

def apply_op(a, b, op):
    if op == '+': return a + b
    if op == '-': return a - b
    if op == '*': return a * b
    if op == '/': return a // b  # 整数除法
    if op == '^': return a ** b

def evaluate(expression):
    values = []
    ops = []
    i = 0
    while i < len(expression):
        if expression[i] == ' ':
            i += 1
            continue
        elif expression[i] == '(':
            ops.append(expression[i])
        elif expression[i].isdigit():
            val = 0
            while i < len(expression) and expression[i].isdigit():
                val = (val * 10) + int(expression[i])
                i += 1
            values.append(val)
            i -= 1
        elif expression[i] == ')':
            while len(ops) != 0 and ops[-1] != '(':
                val2 = values.pop()
                val1 = values.pop()
                op = ops.pop()
                values.append(apply_op(val1, val2, op))
            ops.pop()
        else:
            while (len(ops) != 0 and precedence(ops[-1]) >= precedence(expression[i])):
                val2 = values.pop()
                val1 = values.pop()
                op = ops.pop()
                values.append(apply_op(val1, val2, op))
            ops.append(expression[i])
        i += 1

    while len(ops) != 0:
        val2 = values.pop()
        val1 = values.pop()
        op = ops.pop()
        values.append(apply_op(val1, val2, op))

    return values[-1]

# 示例使用
expression = "3 + 5 * (2 - 8)"
result = evaluate(expression)
print(result)

这个代码会计算给定表达式的值,并支持括号和基本运算符。你可以根据需要调整和扩展这个代码。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-11-1 17:47:34 | 显示全部楼层    本楼为最佳答案   
要计算一个包含括号和基本运算符的表达式的值,你可以使用“逆波兰表达式”(RPN)或“中缀表达式转后缀表达式”的方法。以下是一个简单的思路:

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

以下是实现这个过程的Python代码:
def precedence(op):
    if op == '+' or op == '-':
        return 1
    if op == '*' or op == '/':
        return 2
    if op == '^':
        return 3
    return 0

def apply_op(a, b, op):
    if op == '+': return a + b
    if op == '-': return a - b
    if op == '*': return a * b
    if op == '/': return a // b  # 整数除法
    if op == '^': return a ** b

def evaluate(expression):
    values = []
    ops = []
    i = 0
    while i < len(expression):
        if expression[i] == ' ':
            i += 1
            continue
        elif expression[i] == '(':
            ops.append(expression[i])
        elif expression[i].isdigit():
            val = 0
            while i < len(expression) and expression[i].isdigit():
                val = (val * 10) + int(expression[i])
                i += 1
            values.append(val)
            i -= 1
        elif expression[i] == ')':
            while len(ops) != 0 and ops[-1] != '(':
                val2 = values.pop()
                val1 = values.pop()
                op = ops.pop()
                values.append(apply_op(val1, val2, op))
            ops.pop()
        else:
            while (len(ops) != 0 and precedence(ops[-1]) >= precedence(expression[i])):
                val2 = values.pop()
                val1 = values.pop()
                op = ops.pop()
                values.append(apply_op(val1, val2, op))
            ops.append(expression[i])
        i += 1

    while len(ops) != 0:
        val2 = values.pop()
        val1 = values.pop()
        op = ops.pop()
        values.append(apply_op(val1, val2, op))

    return values[-1]

# 示例使用
expression = "3 + 5 * (2 - 8)"
result = evaluate(expression)
print(result)

这个代码会计算给定表达式的值,并支持括号和基本运算符。你可以根据需要调整和扩展这个代码。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-21 20:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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