题解 | #表达式求值#

表达式求值

http://www.nowcoder.com/practice/9566499a2e1546c0a257e885dfdbf30d

exp_list = []
h_exp_list = []
stack_1 = []
stack_2 = []

def strtolist():
    """处理输入"""
    r_exp = list(input())
    for i in range(len(r_exp)):
        if (r_exp[i] == '[') or (r_exp[i] == '{'):
            r_exp[i] = '('
        if (r_exp[i] == ']') or (r_exp[i] == '}'):
            r_exp[i] = ')'

    flag = 1
    number = 0
    

    for i in range(len(r_exp)):
        # 对负数的处理,第一个数是负数和左括号后面有减号就是负数。
        if (i == 0 and r_exp[i] == '-') or (r_exp[i - 1] == '(' and '-' == r_exp[i]):
            flag = -1
        elif '0' <= r_exp[i] <= '9':
            number = number * 10 + int(r_exp[i])
            if len(r_exp) == i+1 or r_exp[i+1] < '0' or r_exp[i+1] > '9' :
                exp_list.append(flag * number)
                number = 0
                flag = 1
        else:
            exp_list.append(r_exp[i])


def process(ch):
    "中缀表达式转后缀表达式"
    if ('(' == ch):           # 读到左括号时,将其压入堆栈中。
        stack_1.append(ch)
    # 遇到右括号时,右括号本身不入栈,从栈顶开始弹出操作符,放入输出流,直到遇到一个左括号为止,将这个左括号弹出,但是不放入输出流。
    elif (')' == ch):
        while True:
            tmp = stack_1.pop()
            if tmp != '(':
                h_exp_list.append(tmp)
            else:
                break
    elif '*' == ch or '/' == ch:
        while True:
            if 0 == len(stack_1):
                stack_1.append(ch)
                break
            else:
                tmp = stack_1.pop()
                if (tmp == '*') or (tmp == '/'):
                    h_exp_list.append(tmp)
                else:
                    stack_1.append(tmp)
                    stack_1.append(ch)
                    break
    elif '+' == ch or '-' == ch:
        while True:
            if 0 == len(stack_1):
                stack_1.append(ch)
                break
            else:
                tmp = stack_1.pop()
                if '(' != tmp:
                    h_exp_list.append(tmp)
                else:
                    stack_1.append(tmp)
                    stack_1.append(ch)
                    break
    else:
        h_exp_list.append(ch)


strtolist()

for ch in exp_list:
    process(ch)

L = len(stack_1)
while L:
    h_exp_list.append(stack_1.pop())
    L -= 1
def calcuValue(h_exp_list):
    for i in range(len(h_exp_list)):
        if h_exp_list[i] in ['+', '-', '*', '/']:
            op2 = stack_2.pop()
            op1 = stack_2.pop()
            if h_exp_list[i] == '+':
                res = op1 + op2
            elif h_exp_list[i] == '-':
                res = op1 - op2
            elif h_exp_list[i] == '*':
                res = op1 * op2
            elif h_exp_list[i] == '/':
                res = op1 / op2
            stack_2.append(res)
        else:
            stack_2.append(h_exp_list[i])

calcuValue(h_exp_list)
result_list = str(stack_2[0]).split('.')
if result_list[-1] == '0':
    print(result_list[0])
else:
    print(stack_2[0])

PS:这个题目的答案是复用的四则运算那道题的。 PPS:关于详细的思路解法,可以看这里:https://blog.csdn.net/zy010101/article/details/82728726

全部评论

相关推荐

点赞 评论 收藏
分享
评论
3
收藏
分享
正在热议
# 25届秋招总结 #
440109次浏览 4488人参与
# 春招别灰心,我们一人来一句鼓励 #
41383次浏览 524人参与
# 阿里云管培生offer #
119693次浏览 2219人参与
# 地方国企笔面经互助 #
7916次浏览 18人参与
# 虾皮求职进展汇总 #
113709次浏览 881人参与
# 实习,投递多份简历没人回复怎么办 #
2453743次浏览 34846人参与
# 北方华创开奖 #
107263次浏览 599人参与
# 实习必须要去大厂吗? #
55563次浏览 960人参与
# 同bg的你秋招战况如何? #
75265次浏览 549人参与
# 提前批简历挂麻了怎么办 #
149784次浏览 1977人参与
# 投递实习岗位前的准备 #
1195605次浏览 18546人参与
# 你投递的公司有几家约面了? #
33166次浏览 188人参与
# 双非本科求职如何逆袭 #
661802次浏览 7394人参与
# 机械人春招想让哪家公司来捞你? #
157587次浏览 2267人参与
# 如果公司给你放一天假,你会怎么度过? #
4717次浏览 54人参与
# 如果你有一天可以担任公司的CEO,你会做哪三件事? #
11266次浏览 263人参与
# 发工资后,你做的第一件事是什么 #
12368次浏览 61人参与
# 工作中,努力重要还是选择重要? #
35546次浏览 384人参与
# 参加完秋招的机械人,还参加春招吗? #
20072次浏览 240人参与
# 实习想申请秋招offer,能不能argue薪资 #
39211次浏览 314人参与
# 我的上岸简历长这样 #
451881次浏览 8088人参与
# 非技术岗是怎么找实习的 #
155832次浏览 2120人参与
牛客网
牛客企业服务