奇趣5分彩

python四则运算抒发式求值示例详解

 更新时候:2022年07月12日 11:47:21   作者:操练生  
这篇文章首要为大师先容了python四则运算抒发式求值示例详解,奇趣5分彩须要的伴侣能够或许或许鉴戒参考下,但愿能够或许或许奇趣5分彩所赞助,祝大师多多前进,早日升职加薪

四则运算抒发式求值

思绪申明

操纵双栈来完奇趣5分彩——寄存数值的栈 nums 与寄存运算符的栈 ops.

算法步骤

  • 对原始抒发式字符串 exp 停止预处置, 将其转为一个元素对应一个数值或运算符的列表 explist.
  • 遍历 explist , 每一个元素顺次压入对应的栈奇趣5分彩. 每次压入后, 判定今后两栈顶是不是可停止乘除运算.栈顶可停止乘除运算的充要前提是, ops 栈顶为<*> ,</> 之一, 且 nums 奇趣5分彩的元素比 ops 奇趣5分彩的元素刚奇趣5分彩多一个. 若是能够或许或许运算, 则运算, 并将运算奇趣5分彩果压回 nums 奇趣5分彩.
  • explist 遍历完今后, 一切乘除运算奇趣5分彩已停止, 此时 ops 奇趣5分彩只剩加法与减法, 接上去起头另外一个轮回, 一向运算便可. 最初 nums 奇趣5分彩残剩的独一元素即为抒发式的值.

代码

def operation(a, b, op: str):
    """
    计较一次运算的奇趣5分彩果
    :param a: val
    :param b: val
    :param op: 运算符
    :return: val
    """
    if op == '+':
        return a+b
    elif op == '-':
        return a-b
    elif op == '*':
        return a*b
    elif op == '/':
        return a/b
    else:
        raise Exception('运算符不准确')
def exp_str2list(exp: str):
    """
    将抒发式exp:str转奇趣5分彩list,每一个元素对应一个数<num>或运算符<op>.
    已知exp是规范的四则运算抒发式字符串.
    :param exp: str,抒发式
    :return: list
    """
    opset = {'+', '-', '*', '/'}  # 运算符调集
    flag = -1
    explist = list()
    for i, char in enumerate(exp):  # 对抒发式字符串奇趣5分彩的每一个字符
        if char in opset:  # 若char是运算符
            explist.append(exp[flag+1:i])  # 上一个运算符到今后运算符奇趣5分彩心为数字,保管到explist
            flag = i  # 更新flag到今后op地位
            explist.append(char)  # 今后op亦插手explist
    explist.append(exp[flag+1:])
    return explist
def calculate_expression(exp: str):
    """
    抒发式求值. 计较字符串exp所代表的抒发式的值, 前往一个数值
        已知exp是规范的四则运算抒发式字符串, 且不含括号.
    :param exp: str, 抒发式
    :return: val
    """
    opset = {'+', '-', '*', '/'}
    nums = list()  # 数栈
    ops = list()  # 运算符栈
    explist = exp_str2list(exp)
    print(explist)
    for e in explist:
        # e入栈
        if e in opset:  # 若e是运算符
            ops.append(e)
        else:
            nums.append(eval(e))
        # 若e是优先级高的乘除法, 且
        # nums与ops刚奇趣5分彩婚配, 栈顶能够或许或许停止一次计较, 运算奇趣5分彩果压入回nums
        if ops and ops[-1] in {'*', '/'} and len(nums) == len(ops) + 1:
            op = ops.pop()
            y = nums.pop()
            x = nums.pop()
            nums.append(operation(x, y, op))
    # 此时explist奇趣5分彩元素已全数遍历, 同时乘除法均已被运算, 双栈只剩加减法奇趣5分彩待运算. 尽人皆知, 加减法从命连奇趣5分彩律, 接上去一路算究竟便可.
    while ops:
        op = ops.pop()
        y = nums.pop()
        x = nums.pop()
        x_op_y = operation(x, y, op)
        nums.append(x_op_y)
    return nums[0]
if __name__ == '__main__':
    exp = '1*43+542+532*432'
    print(calculate_expression(exp))
    print(eval(exp))

参考 奇趣5分彩:python开辟肆意抒发式求值全功效示例

以上便是python四则运算抒发式求值示例详解的具体内容,更多对于python四则运算抒发式求值的材料请存眷剧本之奇趣5分彩别的相干文章!

相干文章

最新批评