这个好像比较简单。

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

# 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. MySQL数据库的锁详解【转】

    当然在我们的数据库中也有锁用来控制资源的并发访问,这也是数据库和文件系统的区别之一. 为什么要懂数据库锁? 通常来说对于一般的开发人员,在使用数据库的时候一般懂点 DQL(select),DML(in ...

  2. RPC与实践(thrift在windows的编译/安装--c++版)

    ------------------------------------------------------------------------ RPC 功能目标 RPC 的主要功能目标是让构建分布式 ...

  3. 【转】C++中substr的用法

    substr有2种用法:假设:string s = "0123456789"; string sub1 = s.substr(5); //只有一个数字5表示从下标为5开始一直到结尾 ...

  4. MinGW GCC 6.3.0 2017年3月份出炉啦

    MSYS_MinGW-w64_GCC_630_x86-x64_Full 发布日期: 2017-03-07 08:48 68264 KB 下载地址: http://xhmikosr.1f0.de/too ...

  5. $Django Rest Framework-序列化组件

    1 序列化组件 e=serializers.SerializerMethodField()   # 方法名:叫get_字段名, 参数,返回字典  def get_e(self,obj): #obj为b ...

  6. nginx配置文件注释说明

    #定义Nginx运行的用户和用户组 user www www; #nginx进程数,建议设置为等于CPU总核心数. worker_processes 8; #全局错误日志定义类型,[ debug | ...

  7. Select查询命令

    一开始SELECT查询的命令为     SELECT * FROM employee;     SELECT 要查询的列名 FROM 表名字 WHERE 限制条件;     若要查询所有内容,就用*代 ...

  8. 51Nod--1384全排列

    1384 全排列 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出一个字符串S(可能又重复的字符),按照字典序从小到大,输出S包括的字符组成的所有排列.例 ...

  9. 【原创】大数据基础之Flume(2)应用之kafka-kudu

    应用一:kafka数据同步到kudu 1 准备kafka topic # bin/kafka-topics.sh --zookeeper $zk:2181/kafka -create --topic ...

  10. 用KendoGrid控件 快速做CRUD

    先看效果: 主要引用的文件: <link href="/css/kendo/2014.1.318/kendo.common.min.css" rel="styles ...