首页 > 试题广场 >

表达式求值

[编程题]表达式求值
  • 热度指数:135169 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

给定一个字符串描述的算术表达式,计算出结果值。

输入字符串长度不超过 100 ,合法的字符包括 +, -, *, /, (, )0-9

数据范围:运算过程中和最终结果均满足 ,即只进行整型运算,确保输入的表达式合法

输入描述:

输入算术表达式



输出描述:

计算出结果值

示例1

输入

400+5

输出

405
print(eval(input()))
发表于 2024-12-24 15:19:46 回复(0)
print(eval(input()))

发表于 2024-10-02 21:09:26 回复(0)
# 基于栈求解   逆波兰表达式
import re
yxj = {"+":1,"-":1,"*":2,"/":2,"(":3,")":0}
def evaluate_expression(s: str) -> int:
    # 将表达式中的 `{}` 和 `[]` 替换成 `()`
    s = s.replace("{", "(").replace("}", ")")
    s = s.replace("[", "(").replace("]", ")")

    # 拆分成数字和符号的list
    expression_list = re.findall(r'-?\d+|[+*/()-{}[\]]', s)
    temp = []
    for i in range(len(expression_list)):
        if i>0 and len(expression_list[i])>1 and \
           expression_list[i][0]=="-" and expression_list[i-1]!="(":
           temp.append("-")
           temp.append(expression_list[i][1:])
        else:
            temp.append(expression_list[i])
    expression_list = temp
    # print(expression_list)

    # 生成 逆波兰表达式
    nb_exp = []
    ops = []
    for s in expression_list:
        # print(nb_exp)
        # print(ops)
        if s.isdigit()&nbs***bsp;s[1:].isdigit():
            nb_exp.append(s)
        elif s in ("*","/","+","-","("):
            if len(ops)==0&nbs***bsp;(len(ops)!=0 and yxj[ops[-1]]<yxj[s])&nbs***bsp;ops[-1]=="(":
                ops.append(s)
            else:
                while yxj[s]<= yxj[ops[-1]] and ops[-1] != "(":
                    nb_exp.append(ops.pop())
                    if len(ops)==0:
                        break
                ops.append(s)
        elif s == ')':
            while ops[-1] != "(":
                nb_exp.append(ops.pop())
            ops.pop()   # 弹出“(”
    while ops != []:
        nb_exp.append(ops.pop())
    # print(nb_exp)
    # 求值
    res = []
    for s in nb_exp:
        if s.isdigit()&nbs***bsp;s[1:].isdigit():
            res.append(s)
        else:
            right = float(res.pop())
            left = float(res.pop())
            if s=="+":
                res.append(right+left)
            if s=="-":
                res.append(left-right)
            if s=="*":
                res.append(right*left)
            if s=="/":
                res.append(left/right)

    return res[0]

s = input().strip()
print(int(evaluate_expression(s)))



发表于 2024-09-25 00:11:10 回复(0)
print(eval(input()))
#python3  厉害 一行解决
发表于 2024-09-12 16:13:30 回复(0)
class Solution:
    def infix_to_postfix(cls, expression):
        precedence = {"+": 1, "-": 1, "*": 2, "/": 2}  # 计算符号的优先级map
        operator_stack = []  # 操作符栈
        output = []

        for char in expression:  # 对每个中缀表达式遍历
            if char.isspace():
                continue

            elif char == '(':  # 左括号压入栈中
                operator_stack.append(char)
            elif char == ')':  # 右括号,将栈中元素弹出,直到遇到左括号
                while operator_stack and operator_stack[-1] != '(':
                    output.append(operator_stack.pop())
                operator_stack.pop()  # 弹出左括号
            elif char in precedence:
                while operator_stack and operator_stack[-1] != '(' and precedence[char] <= precedence.get(
                        operator_stack[-1], 0):
                    output.append(operator_stack.pop())
                operator_stack.append(char)
            elif char.isdigit() or isinstance(int(char), int):  # 处理数字和空格
                output.append(char)

        while operator_stack:
            output.append(operator_stack.pop())

        return output

    def evalRPN(self, tokens: List[str]) -> int:
        stk = []
        for token in tokens:
            if token in "+-*/":
                # 是个运算符,从栈顶拿出两个数字进行运算,运算结果入栈
                a = stk.pop()
                b = stk.pop()
                if token == "+":
                    stk.append(a + b)
                elif token == "*":
                    stk.append(a * b)
                # 对于减法和除法,顺序别搞反了,第二个数是被除(减)数
                elif token == "-":
                    stk.append(b - a)
                elif token == "/":
                    stk.append(int(b / a))  # Ensure the result is an integer
            else:
                # 是个数字,直接入栈即可
                stk.append(int(token))
        # 最后栈中剩下一个数字,即是计算结果
        return stk.pop()

    def str_to_token(self, string):
        tokens = []
        i = 0
        while i < len(string):
            if string[i].isdigit():
                j = i + 1
                while j<len(string) and string[j].isdigit():
                    j += 1
                tokens.append(string[i:j])
                i = j
            elif string[i] == "-":
                if i == 0 or (i > 0 and string[i - 1] in "(+*/"):
                    j = i + 1
                    while j<len(string) and string[j].isdigit():
                        j += 1
                    tokens.append(string[i:j])
                    i = j
                else:
                    tokens.append(string[i])
                    i += 1
            else:
                tokens.append(string[i])
                i += 1
        return tokens

a = input()
res = Solution().str_to_token(a)
res = Solution().infix_to_postfix(res)
res = Solution().evalRPN(res)
print(res)


真特么离谱,这是简单题?

发表于 2024-09-02 13:01:27 回复(0)
s=input()
print(eval(s))

发表于 2024-08-10 20:20:53 回复(0)
print(int(eval(input())))
编辑于 2024-04-18 20:03:37 回复(0)
import sys
s=input()
def compute(lst):#计算无括号列表的值如:['1','+','2','*','-3','/','2','-','4'],
    s=[]
    for i in lst:#先计算乘除法
        if s and (i.isnumeric()&nbs***bsp;(i[0]=='-' and len(i)>1)) and s[-1] in ['*','/']:#如果i为正数或负数字符串且上一个符号为乘号或除号
            if s[-1]=='*':
                s[-2:]=[str(int(s[-2])*int(i))]
            if s[-1]=='/':
                s[-2:]=[str(int(s[-2])//int(i))]
        else:
            s.append(i)
    s1=[]
    for i in s:#计算加减法
        if s1 and s1 and (i.isnumeric()&nbs***bsp;(i[0]=='-' and len(i)>1)):
            if s1[-1]=='+':
                s1[-2:]=[str(int(s1[-2])+int(i))]
            if s1[-1]=='-':
                s1[-2:]=[str(int(s1[-2])-int(i))]
        else:
            s1.append(i)
    return int(s1[0])
def f(s):
    #为便于计算,在-前加0
    if s[0]=='-':
        s=('0'+s)
    while '(-' in s:
        s=s.replace('(-','(0-')
    lst=[]
    for c in s:
        if lst:
            if lst[-1].isnumeric() and c!=')':
                if c.isnumeric():
                    lst[-1]+=c
                else:
                    lst.append(c)
            else:
                if c==')':
                    i=len(lst)-1
                    while lst[i]!='(':#计算上一个左括号的位置
                        i-=1
                    temp=lst[i+1:]
                    lst[i:]=[str(compute(temp))]#计算括号内的值并添加到列表末尾
                else:
                    lst.append(c)                      
        else:
            lst.append(c)    
    #print('lst:',lst)
    return compute(lst)
print(f(s))

发表于 2024-03-07 19:16:18 回复(0)
print(eval(input()))


发表于 2023-11-06 14:56:31 回复(0)
fomula = input()
print(eval(fomula))

发表于 2023-09-18 13:41:36 回复(0)
#考虑了有负数的情况
s = input()
prior = {"(": 0, "+": 1, "-": 1, "/": 2, "*": 2, ")": 3}
s = list(s.strip(" "))
num_stack = []
op_stack = []


def tow_num():
    if len(num_stack) > 0:
        num2, num1 = num_stack.pop(), num_stack.pop()
        op = op_stack.pop()
        if op == "+":
            num_stack.append((num1 + num2))
        if op == "-":
            num_stack.append((num1 - num2))
        if op == "*":
            num_stack.append((num1 * num2))
        if op == "/":
            num_stack.append((num1 // num2))


i = 0
while i < len(s):
    c = s[i]
    if c.isdigit():
        num = 0
        pos = 0
        if (
            i != 0
            and s[i - 1] == "-"
            and s[i - 2] == "("
           &nbs***bsp;(i == 1 and s[i - 1] == "-")
        ):
            pos = 1
        else:
            pos = 0
        j = i
        while j < len(s) and s[j].isdigit():
            num = num * 10 + int(s[j])
            j += 1
        if pos == 1:
            num_stack.append(-num)
            op_stack.pop()
        else:
            num_stack.append(num)
        i = j
    elif c in "+-/*":
        while op_stack and prior[op_stack[-1]] >= prior[c]:
            tow_num()
        op_stack.append(c)
        i += 1
    elif c == "(":
        op_stack.append(c)
        i += 1
    elif c == ")":
        while op_stack[-1] != "(":
            tow_num()
        op_stack.pop()
        i += 1
while op_stack:
    tow_num()
print(num_stack[-1])

发表于 2023-05-05 19:19:39 回复(0)
import re


n = input().strip()
if len(n) in range(1, 101):
    a = len(re.findall(r"[^\+\-\*\/\(\,\)\d]", n))
    if a > 0:
        print("wrong")
    else:
        print(eval(n))

发表于 2023-04-09 16:54:05 回复(0)
s=input()
print(eval(s))
发表于 2023-02-14 09:13:27 回复(0)
print(eval(input()))

发表于 2023-02-03 21:12:04 回复(1)
def calc(s):
    args = list()
    temp = ''
    pn = 0
    pn_st = 0
    for i in range(len(s)):
        if s[i] == '(':
            pn += 1
            if pn == 1:
                pn_st = i + 1
        elif s[i] == ')':
            pn -= 1
            if pn == 0:
                args.append(calc(s[pn_st:i]))
        elif pn == 0:  # 没有括号的情况
            if s[i].isdigit():
                temp += s[i]
                if i == len(s) - 1:
                    args.append(int(temp))
                    temp = ''
                elif not s[i + 1].isdigit():
                    args.append(int(temp))
                    temp = ''
            else:
                args.append(s[i])

    ans1 = list()
    op = ''
    for i in range(len(args)):
        if isinstance(args[i], int):
            if op == '':
                ans1.append(args[i])
            elif op == '*':
                ans1[-1] = ans1[-1] * args[i]
                op = ''
            elif op == '/':
                ans1[-1] = ans1[-1] / args[i]
                op = ''
        elif args[i] == '*':
            op = args[i]
        elif args[i] == '/':
            op = args[i]
        elif args[i] == '+':
            ans1.append(args[i])
        elif args[i] == '-':
            ans1.append(args[i])

    ans = 0
    op = ''
    for i in range(len(ans1)):
        if isinstance(ans1[i], int):
            if op == '':
                ans = ans1[i]
            elif op == '+':
                ans += ans1[i]
            elif op == '-':
                ans -= ans1[i]
        elif ans1[i] == '+': 
            op = ans1[i]
        elif ans1[i] == '-':
            op = ans1[i]

    return ans


line = input()
print(calc(line))

发表于 2022-10-22 14:07:28 回复(0)

问题信息

难度:
30条回答 41933浏览

热门推荐

通过挑战的用户

表达式求值