首页 > 试题广场 >

表达式求值

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

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

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

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

输入描述:

输入算术表达式



输出描述:

计算出结果值

示例1

输入

400+5

输出

405
# python3表达式求值,用eval()来做
print(eval(input()))


发表于 2021-04-22 10:20:53 回复(0)

问题:如何判断'-'是减号还是负号? 例如 -1*(-1-1)  -2*(-1+3)(1-2)-3*4
解答:如果前一个字符是 数字 或者 右括号时,是减号。其余是负号

思路

  1. 用两个栈分别压数字和运算符;
  2. 如果当前运算符优先级不高于栈顶运算符('*/')优先级,从数字栈中弹出两个数,从运算符栈中弹出栈顶运算符,进行运算,数字栈压入运算结果,符号栈压入当前运算符。重复该操作直到当前运算符优先级高于栈顶,将运算符入栈
  3. 出现左括号,则直接压入;出现右括号,则从数字栈中弹出两个数,从运算符栈中弹出栈顶运算符,进行运算,数字栈压入运算结果,重复该操作直到栈顶弹出右括号位置。
  4. def fun(m,n,s):
        if s=='*':
            return n*m
        if s=='/':
            return n/m
        if s=='+':
            return n+m
        if s=='-':
            return n-m
    while True:
        try:
            ss=input().strip()
            digit=[]
            do=[]
            ss='('+ss+')'
            dd={'*':1,'/':1,'+':0,'-':0,'(':-1}
            i=0
            while i < len(ss):
                s=ss[i]
                if s.isdigit():#当前为数字直接入栈
                    i=i+1
                    while ss[i].isdigit():#数字是多个字符的
                        s=s+ss[i]
                        i=i+1
                    digit.append(int(s))
                elif s in dd.keys() and s!='(':# 当前为运算符
                    do_pre=do[-1]
                    if s=='-' :# 判断是减号 还是负号
                        if (ss[i-1].isdigit()&nbs***bsp;ss[i-1] in ['}',']',')']):# 是减号时,进行优先级判断并做运算
                            while dd[s]<=dd[do_pre]:
                                result0=fun(digit.pop(),digit.pop(),do.pop())
                                digit.append(result0)
                                do_pre=do[-1]
                            do.append(s)
                            i=i+1
                        else:# 是负号,将负数入栈
                            i=i+1
                            s0=''
                            while ss[i].isdigit():
                                s0=s0+ss[i]
                                i=i+1
                            digit.append(-int(s0))
                    else:# 除了减号之外的运算符,进行优先级判断并计算,直到当前符号优先级高于栈顶
                        while dd[s]<=dd[do_pre]:
                            result0=fun(digit.pop(),digit.pop(),do.pop())
                            digit.append(result0)
                            do_pre=do[-1]
                        do.append(s)
                        i=i+1
                elif s in ['{','[','(']:#左括号直接入栈
                    do.append(s)
                    i=i+1
                elif s in ['}',']',')']:#遇到右括号,进行计算,直到遇到左括号为止,将计算结果入栈
                    i=i+1
                    do_now=do.pop()
                    while do_now not in ['{','[','(']:
                        result0=fun(digit.pop(),digit.pop(),do_now)
                        digit.append(result0)
                        do_now=do.pop()
            print(digit[0])
        except:
            break
    



发表于 2021-03-25 18:02:54 回复(0)
print(eval(input().replace('[', '(').replace(']',')').replace('{','(').replace('}',')')))
发表于 2021-03-18 22:56:12 回复(0)
import re


prio = {
    "(": 0,
    "+": 1,
    "-": 1,
    "*": 2,
    "/": 2
}


def pre_process(s):
    return re.sub(r"(?<![0-9\)])(?=-[0-9\()])", r"0", s)


def pop_and_cal(op, data):
    o, b, a = op.pop(), data.pop(), data.pop()
    if o == "+":
        data.append(a+b)
    elif o == "-":
        data.append(a-b)
    elif o == "*":
        data.append(a*b)
    else:
        data.append(a/b)


def cal(exp):
    i, op, data = 0, [], []
    while i < len(exp):
        c = exp[i]
        if c.isdigit():
            j = i+1
            for j in range(i+1, len(exp)):
                if not exp[j].isdigit():
                    break
            data.append(int( exp[i:j] ))
            i = j
            continue
        elif not op:
            op.append(c)
        elif c == "(":
            op.append(c)
        elif c == ")":
            while op[-1] != "(":
                pop_and_cal(op, data)
            op.pop()
        else:
            while op and prio[op[-1]] >= prio[c]:
                pop_and_cal(op, data)
            op.append(c)
        i += 1
    while op:
        pop_and_cal(op, data)
    return data[0]


s = input()
exp = pre_process(s)
print(cal(exp))

发表于 2020-12-21 21:48:45 回复(1)
data = raw_input()
print eval(data)
发表于 2020-12-16 11:25:49 回复(0)
while True:
    try:
        express = input()
        print(eval(express))
    except:
        break
        

发表于 2020-11-13 21:27:56 回复(0)
#没想到自带的eval()函数

def cut(list1):
    list2 = []
    list3 = []
    for i in range(0,len(list1)):
        if (list1[i] != '+') & (list1[i] != '-') & (list1[i] != '*') & (list1[i] != '/') & (list1[i] != '(') & (list1[i] != ')'):
            list2.append(list1[i])
        elif list2 == []:
            list3.append(list1[i])
        else:
            str1 = ''.join(list2)
            list2 = []
            list3.append(str1)
            list3.append(list1[i])
    if list2 != []:
        str1 = ''.join(list2)
        list3.append(str1)
    return list3


def chengchu(list1):
    list2 = []
    len1 = len(list1)
    for index in range(0,len1):
        if (list1[index] != '*') & (list1[index] != '/'):
            list2.append(list1[index])
        elif (list1[index] == '*'):
            del list2[-1]
            int1 = int(list1[index-1]) * int(list1[index+1])
            list1[index+1] = int1
        elif (list1[index] == '/'):
            del list2[-1]
            int1 = int(list1[index-1]) // int(list1[index+1])
            list1[index+1] = int1
    return list2

def jiajian(list1):
    list2 = []
    len1 = len(list1)
    for index in range(0,len1):
        if (list1[index] != '+') & (list1[index] != '-'):
            list2.append(list1[index])
        elif (list1[index] == '+'):
            del list2[-1]
            int1 = int(list1[index-1]) + int(list1[index+1])
            list1[index+1] = int1
        elif (list1[index] == '-'):
            del list2[-1]
            int1 = int(list1[index-1]) - int(list1[index+1])
            list1[index+1] = int1
    return list2            

def kuohao(list1):
    while '(' in list1:
        list2 = []
        for i in range(0,len(list1)):
            if list1[i] == '(':
                x = i
            elif list1[i] == ')':
                y = i
                break
        for i in range(x+1,y):
            list2.append(list1[i])
        list2 = chengchu(list2)
        list2 = jiajian(list2)
        for i in range(x+1,y+1):
            del list1[x+1]
        list1[x] = list2[0]
    return list1

while True:
    try:
        list1 = list(input().strip())
        list1 = cut(list1)
        list1 = kuohao(list1)
        list1 = chengchu(list1)
        list1 = jiajian(list1)
        print(int(list1[0]))                
    except:
        break
发表于 2020-09-14 20:39:24 回复(0)
while True:
    try:
        exp = input()
        print(eval(exp))
    except:
        break
不能用exec(),eval()才有返回值
发表于 2020-08-28 16:20:40 回复(0)
while True:
    try:
        math = input()
        print(eval(math))
    except:
        break

发表于 2020-05-13 16:04:52 回复(0)
print(eval(str(input())))

发表于 2020-02-19 08:03:13 回复(0)
input_str = input()
re = eval(input_str)

print(re)

发表于 2019-10-18 21:22:15 回复(0)
def sum():
    m = input()
    if len(m) > 100:
        raise InputError('"your inputs out of limit"')
    else:
        s = eval(m)
        print(s)    
    
if __name__ == '__main__':
    sum()
发表于 2019-09-23 22:33:13 回复(0)
print(eval(input()))

发表于 2019-08-21 22:31:39 回复(3)
while True:
    try:
        function=input()
        #print(function)
        result=eval(function)#计算字符串表达式
        print(result)
    except:
        break

Python 大法好

发表于 2019-06-14 10:34:12 回复(0)
while True:
    try:
        print(eval(input()))
    except:
        break
发表于 2019-06-01 23:48:24 回复(0)

python 3 一行的解法:

print(eval(input()))
发表于 2017-09-06 14:58:09 回复(30)
a = raw_input()
print eval(a)
发表于 2017-04-06 20:40:24 回复(0)
print input()

发表于 2016-12-23 20:10:06 回复(0)

问题信息

难度:
20条回答 38874浏览

热门推荐

通过挑战的用户

查看代码