Python计算器之逆波兰实现

# -*- coding: utf-8 -*
import re

def fmt_exp(exp):
    no_space = re.sub(' ', '', exp)
    r = re.compile('([+\-*/()]|\d+\.?\d*)')
    r_minus = re.compile('^[\d+\.?\d*]')
    # exp_fnl = r_minus.sub()
    exp_fnl = r.findall(no_space)
    exp_li = list(exp_fnl)
    if exp_li[0] == '-':
        exp_li.insert(0, '0')
    for i in exp_li:
        idx = exp_li.index(i)
        if i == '(':
            # print(idx)
            if exp_li[idx + 1] == '-':
                exp_li.insert(idx + 1, '0')
                continue
    return exp_li


def Lukasiewicz(exp):
    li_1 = []  # li_1中的结果最后存的就是逆波兰表达式
    li_2 = []  # li_2中将用于暂时存放运算符并且在最终形成逆波兰表达式的时候,该栈是会清空的
    add_sub = ['+', '-']
    mul_dev = ['*', '/']

    li = fmt_exp(exp)
    for i in li:
        if i == ')':
            while True:
                if len(li_2):
                    tmp = li_2[-1]    # li_2的栈顶已经保存下来,在下一步进行pop,如果遇到'(', '('已经被弹出
                    li_2.pop()
                    if tmp != '(':
                        li_1.append(tmp)
                    else:
                        break
        elif i in add_sub:
            while len(li_2) and li_2[-1] in mul_dev:
                    li_1.append(li_2[-1])
                    li_2.pop()
            if len(li_2):
                if li_2[-1] != '(':
                    li_1.append(li_2.pop())
                    li_2.append(i)
                else:
                    li_2.append(i)
            else:
                li_2.append(i)
        elif i in mul_dev or i == '(':
            li_2.append(i)
        else:
            li_1.append(i)
    while len(li_2):
        li_1.append(li_2.pop())

    return li_1


def cal_Lukasiewicz(exp):
    li = []
    op = ['+', '-', '*', '/']
    for i in exp:
        if i in op:
            if len(li) > 2 or len(li) == 2:
                s2 = li.pop()
                s1 = li.pop()

                if i == '+':
                    tmp = float(s1) + float(s2)
                if i == '-':
                    tmp = float(s1) - float(s2)
                if i == '*':
                    tmp = float(s1) * float(s2)
                if i == '/':
                    tmp = float(s1) / float(s2)

                li.append(tmp)
        else:
            li.append(i)   # i.isdigit() 不能判断浮点数为数字
    print(li)


if __name__ == '__main__':
    # exp = '0-1-4*(3-10*(3*2-1*9/(3-4*5+ 4/2)))  +  10.5 - (4+7)'
    exp = '6-2*(-3)'
    # exp = '0-1-4*(3-10*(3*2-1*9/(3-4)))  +  10.5 - (4+7)'
    # exp = '1 + 2 * 3 - (4 * 5 + 6) * 7'
    # 123*+45*6+7*+
    # exp = '(5 * (((9 + 8) * (4*6))+7))'
    # 598+46**7+*

    print(exp)
    ret = Lukasiewicz(exp)
    print(ret)
    t = cal_Lukasiewicz(ret)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容