这个好像比较简单。

前缀规则好像还没有理清楚。

# coding = utf-8

class Stack:
    def __init__(self):
        self.items = []

    # 是否为空
    def is_empty(self):
        return self.items == []

    # 进栈
    def push(self, item):
        self.items.append(item)

    # 出栈
    def pop(self):
        return self.items.pop()

    # 返回栈顶值,不改变栈
    def peek(self):
        return self.items[len(self.items) - 1]

    # 返回栈长度
    def size(self):
        return len(self.items)

def infix_to_postfix(infix_expr):
    prec = dict()
    prec["*"] = 3
    prec["/"] = 3
    prec["+"] = 2
    prec["-"] = 2
    prec["("] = 1
    prec[")"] = 1
    postfix_expr = []
    s = Stack()
    for item in infix_expr.split():
        # 如果标记是操作数,将其附加到输出列表的末尾
        if item not in prec.keys():
            postfix_expr.append(item)
        # 如果标记是左括号,将其压到 s 上
        elif item == '(':
            s.push(item)
        # 如果标记是右括号,则弹出 s,直到删除相应的左括号。将每个运算符附加到
        # 输出列表的末尾
        elif item == ')':
            while s.peek() != '(':
                postfix_expr.append(s.pop())
            s.pop()
        # 如果标记是运算符, *,/,+  或  -  ,将其压入 s。但是,首先删除已经在
        # s 中具有更高或相等优先级的任何运算符,并将它们加到输出列表中
        else:
            while (not s.is_empty()) \
                    and (prec[s.peek()] >= prec[item]):
                postfix_expr.append(s.pop())
            s.push(item)
        print(s.items)
    # 当输入表达式被完全处理时,检查 s。仍然在栈上的任何运算符都可以删除并加到
    # 输出列表的末尾
    while not s.is_empty():
        postfix_expr.append(s.pop())

    return ' '.join(postfix_expr)

def postfix_eval(postfix_expr):
    s = Stack()
    for item in postfix_expr.split():
        # 如果不是运算符号,压栈
        if item not in '+-*/':
            s.push(item)
        else:
            # 如果是运算符号,取出栈上最近两个数字进行运算
            # 然后,再将结果压回栈
            op2 = int(s.pop())
            op1 = int(s.pop())
            print(op1, item, op2)
            result = do_match(item, op1, op2)
            s.push(result)
        print(s.items)
    return result

# 运行结果
def do_match(op, op1, op2):
    if op == '+':
        return op1 + op2
    elif op == '-':
        return op1 - op2
    elif op == '*':
        return op1 * op2
    elif op == '/':
        return op1 / op2
    else:
        raise Exception('Error operation!')

infix_str = '( 23 + 2 ) * 5 - 280 / ( 4 + 11 * 6 - 35 )'

postfix_output = infix_to_postfix(infix_str)
print(infix_str)
print(postfix_output)
postfix_result = postfix_eval(postfix_output)
print(postfix_result)

  

输出:显示了栈的情况

C:\Users\Sahara\.virtualenvs\untitled\Scripts\python.exe D:/test/python_stack.py
['(']
['(']
['(', '+']
['(', '+']
[]
['*']
['*']
['-']
['-']
['-', '/']
['-', '/', '(']
['-', '/', '(']
['-', '/', '(', '+']
['-', '/', '(', '+']
['-', '/', '(', '+', '*']
['-', '/', '(', '+', '*']
['-', '/', '(', '-']
['-', '/', '(', '-']
['-', '/']
( 23 + 2 ) * 5 - 280 / ( 4 + 11 * 6 - 35 )
23 2 + 5 * 280 4 11 6 * + 35 - / -
['23']
['23', '2']
23 + 2
[25]
[25, '5']
25 * 5
[125]
[125, '280']
[125, '280', '4']
[125, '280', '4', '11']
[125, '280', '4', '11', '6']
11 * 6
[125, '280', '4', 66]
4 + 66
[125, '280', 70]
[125, '280', 70, '35']
70 - 35
[125, '280', 35]
280 / 35
[125, 8.0]
125 - 8
[117]
117

  

python-中缀转换后缀并计算的更多相关文章

  1. 《java数据结构与算法》笔记-CH4-8栈结构实现后缀表达式计算结果

    /** * 中缀表达式转换成后缀表达式: 从输入(中缀表达式)中读取的字符,规则: 操作数: 写至输出 左括号: 推其入栈 右括号: 栈非空时重复以下步骤--> * 若项不为(,则写至输出: 若 ...

  2. ZH奶酪:Python 中缀表达式转换后缀表达式

    实现一个可以处理加减乘数运算的中缀表达式转换后缀表达式的程序: 一个输入中缀表达式inOrder 一个输出池pool 一个缓存栈stack 从前至后逐字读取inOrder 首先看一下不包含括号的: ( ...

  3. 栈应用之 后缀表达式计算 (python 版)

    栈应用之 后缀表达式计算 (python 版) 后缀表达式特别适合计算机处理 1.  中缀表达式.前缀表达式.后缀表达式区别  中缀表达式:(3 - 5) * (6 + 17 * 4) / 3 17 ...

  4. PTA-7-20 表达式转换(中缀转后缀,带括号,负数,小数转换)

    本题考点:中缀表达式转后缀表达式. 难点: 带有小数的数字 数字可能带有正负号 题目描述: 算术表达式有前缀表示法.中缀表示法和后缀表示法等形式.日常使用的算术表达式是采用中缀表示法,即二元运算符位于 ...

  5. 栈的应用1——超级计算器(中缀与后缀表达式)C语言

    这里要学的程序主要用来实现一个功能——输入表达式输出结果,也就是一个计算器.效果如下: 这个程序主要有两个步骤:1.把中缀表达式转换为后缀表达式:2.计算后缀表达式的结果. 首先先明白几个问题: 1. ...

  6. Java数据结构和算法(六)——前缀、中缀、后缀表达式

    前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...

  7. C++ 中缀转后缀表达式并求值

    //中缀转后缀 #include<iostream> #include<stack> using namespace std; int prio(char x){ ; ; ; ...

  8. Java数据结构和算法(六):前缀、中缀、后缀表达式

    前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...

  9. 【C++】朝花夕拾——中缀转后缀

    对于简单的四则运算而言,后缀表达式可以通过使用栈(stack)快速算出结果 ==================================我是分割线======================= ...

随机推荐

  1. PHP操作redis详细讲解(转)

    PHP中redis的使用   redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合)和z ...

  2. CentOS yum 安装 Apache + PHP + MySQL

    # 检查并卸载rpm -qa|grep httpdrpm -e httpdrpm -qa|grep mysqlrpm -e mysqlrpm -qa|grep phprpm -e php # 删除默认 ...

  3. hibernate框架学习之二级缓存(测试用例)

    HqlDemoApp.java package cn.itcast.h3.query.hql; import java.io.Serializable; import org.hibernate.Qu ...

  4. #ifndef#define#endif的用法(整理)

    [转] #ifndef#define#endif的用法(整理)    原作者:icwk  文件中的#ifndef 头件的中的#ifndef,这是一个很关键的东西.比如你有两个C文件,这两个C文件都in ...

  5. (二)远程代理Remoting/RealProxy

    使用.Net Remoting/RealProxy 采用TransparentProxy和RealProxy实现对象的代理,实现思路如下:Client -TransparentProxy - Real ...

  6. 正版phpstorm,webstorm,goland(Jetbrains系列都可以)免费激活步骤(图文详解)(亲测有效)

    1 前言 Jetbrains系列都可以,包括webstrom,phpstorm,goland等. 附加其它方案如下: webstrom(注册机) goland(破解补丁) 2 步骤 1. 可以先试用, ...

  7. 修改oracle数据库允许连接的数

    当前连接数:select count(*) from v$process;查询数据库允许的最大连接数: select value from v$parameter where name = 'proc ...

  8. linux杀死僵尸进程

    用下面的命令找出僵死进程 ps -A -o stat,ppid,pid,cmd | grep -e '^[Zz]' 命令注解: -A 参数列出所有进程 -o 自定义输出字段 我们设定显示字段为 sta ...

  9. 4)协程一(yeild)

    一:什么协程 协程: coroutine/coro - 轻量级线程(一个线程) - 调度由用户控制 - 有独立的寄存器上下文和栈 - 切换时保存状态,回来时恢复 二:协程和多线程比较 协程: coro ...

  10. 帮你彻底搞懂JS中的prototype、__proto__与constructor(图解)

    作为一名前端工程师,必须搞懂JS中的prototype.__proto__与constructor属性,相信很多初学者对这些属性存在许多困惑,容易把它们混淆,本文旨在帮助大家理清它们之间的关系并彻底搞 ...