如何用python实现将中缀表达式改成后缀表达式

news2024/11/17 15:27:36

例:如何将1 *(3 * 4 /(8 - (7 + 0)))改成后缀表达式
可以先看看这篇文章,写得很详细清楚

思路

从左到右依次遍历中缀表达式各个字符

第一个字符为运算数,直接输出:
在这里插入图片描述

第二个字符为操作符,满足 栈空/优先级高于栈顶操作符 条件,该操作符入栈:
在这里插入图片描述
第三个字符为左括号,直接入栈(入栈后优先级降至最低):

在这里插入图片描述
第四个字符为运算数,直接输出:
在这里插入图片描述
第五个字符为操作符*,优先级大于左括号,入栈:
在这里插入图片描述
第六个字符为运算数,直接输出:
在这里插入图片描述

第七个字符为操作符/,优先级等于*,*出栈,/入栈:
在这里插入图片描述

第八个字符为左括号,直接入栈:
在这里插入图片描述

第九个字符为运算数,直接输出:
在这里插入图片描述

第10个字符为操作符-,优先级大于左括号,入栈:
在这里插入图片描述

第11个字符为左括号,直接入栈:
在这里插入图片描述

第12个字符为运算数,直接输出:
在这里插入图片描述

第13个字符为操作符+,优先级大于左括号,入栈:
在这里插入图片描述
第14个字符为运算数,直接输出:
在这里插入图片描述
第15个字符为右括号,+出栈进入到后缀表达式中,左括号出栈
在这里插入图片描述
第16个字符为右括号,-出栈进入到后缀表达式中,左括号出栈:
在这里插入图片描述
第17个字符为右括号,/出栈进入到后缀表达式中,左括号出栈:
在这里插入图片描述
中缀表达式遍历完成,判断字符栈中是否还有操作符,如有则出栈并输出:
在这里插入图片描述

def infix_to_postfix(expression):  
    # 优先级字典  
    precedence = {  
        '+': 1,  
        '-': 1,  
        '*': 2,  
        '/': 2  
    }  
    
    output = []  # 输出队列  
    operators = []  # 操作符栈  
    
    # 处理括号和运算符的情况  
    tokens = expression.replace('(', ' ( ').replace(')', ' ) ').split()  
    
    for token in tokens:  
        if token.isnumeric():  # 如果是数字  
            output.append(token)  
        elif token in precedence:  # 如果是操作符  
            while (operators and operators[-1] != '(' and  
                   precedence[operators[-1]] >= precedence[token]):  
                output.append(operators.pop())  
            operators.append(token)  
        elif token == '(':  # 左括号  
            operators.append(token)  
        elif token == ')':  # 右括号  
            while operators and operators[-1] != '(':  
                output.append(operators.pop())  
            operators.pop()  # 弹出 '('  

    # 弹出栈中剩余的操作符  
    while operators:  
        output.append(operators.pop())  

    return output  

# 示例使用  
infix_expression = "1 * (3 * 4 / (8 - (7 + 0)))"  
postfix_expression = infix_to_postfix(infix_expression)  

print(postfix_expression)  # 输出后缀表达式

expression.replace('(', ' ( ').replace(')', ' ) ').split() 这一段代码的目的是将一个数学表达式中的括号处理成更易于分割的形式,并最终将整个表达式拆分成一个单词(或符号)列表。以下是对这段代码的逐步解释和示例:

解释

  1. replace('(', ' ( '):在表达式中找到所有左括号 (,并在它们的前后加上空格。这样可以确保左括号和其他符号之间有明确的分隔。

  2. replace(')', ' ) '):同理,在表达式中找到所有右括号 ),并在它们的前后加上空格。

  3. split():将经过替换的字符串拆分成一个列表,默认通过空格作为分隔符。

示例

假设我们有一个表达式:

expression = "1 * (3 + 4) / (8 - 2)"

应用上述代码:

processed_expression = expression.replace('(', ' ( ').replace(')', ' ) ').split()

步骤详细如下:

  1. 替换左括号

    • "1 * (3 + 4) / (8 - 2)" 变成 "1 * ( 3 + 4 ) / ( 8 - 2 )"
  2. 替换右括号

    • "1 * ( 3 + 4 ) / ( 8 - 2 )" 变成同样的字符串,因为右括号在前后已被处理。
  3. 拆分

    • split() 返回列表:
    ['1', '*', '(', '3', '+', '4', ')', '/', '(', '8', '-', '2', ')']
    

总结

最终的结果是一个符号列表,这对于后续的分析(比如计算或转换为后缀表达式)是非常有用的。这样的处理可以帮助解析数学表达式,使得每个操作符和操作数都能被单独识别。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1991742.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[Vue篇]vue3组合式API实现todo列表

今天的例子是使用vue3的一个新 API:computed()。它可以让我们创建一个计算属性 ref,这个 ref 会动态地根据其他响应式数据源来计算其 .value。计算属性会自动跟踪其计算中所使用的到的其他响应式状态,并将它们收集为自己的依赖。计算结果会被…

Typora 伪装 LaTeX 中文样式主题 学习笔记

最近发现一个比较有意思的项目,Typora 伪装 LaTeX 中文样式主题 用来写毕设论文的初稿,格式可以统一控制,比较方便。项目“第五章”源格式是“5 系统测试”靠左,就像5.1一样。搜索了一下获得了一些零散的知识点记下来。 在Typora的…

leetCode- - - 链表

目录 1.反转链表(leetcode206) ​编辑 2. 链表内指定区间反转(leetcode92) 3.链表中的节点每k个一组翻转(leetcode25) 4.合并两个排序的链表(leetcode21) 5.链表的中间节点&am…

揭开 OKR 神秘面纱:打破OKR的概念 –(第1部分)

请注意,《 OKR 解密 》分为5个部分,您目前正在学习其中的一个基本部分(5个部分中的第1部分)。在这5个要素中,我们将从理论(第1部分)、应用(第2部分)、最佳实践&#xff0…

机房托管费用贵吗?机房托管要考虑哪些因素?

机房托管费用受多种因素影响,包括地理位置、设备规模、服务水平、安全性要求等。不同配置和服务质量的托管价格差异较大,一般1U服务器托管费用一年在2000到5000元之间。Rak部落为您整理发布机房托管费用的差异,希望对您选择机房托管时有帮助。…

【GD32 MCU入门教程】四、GD32 MCU 常见外设介绍(3)NVIC 介绍

NVIC(Nested vectored interrupt controller,嵌套向量中断控制器)是Cortex-M处理器的一部分,它是可编程的,且寄存器位于存储器映射的系统控制空间(SCS)。NVIC与内核相辅相成,共同完成对中断的响应。本章将介绍中断的优先级设置、如…

教育机构如何避免数据泄露?两种方法保护数据安全

随着数字化时代的发展,教育机构的很多信息都以数字化的方式存储在计算机或移动存储设备中。为了避免数据泄露,我们需要加密保护重要数据。下面我们就来了解一下教育机构避免数据泄露的方法。 超级加密3000 电脑在教育行业中扮演着重要的角色&#xff0c…

阿里云万网推出首个域名AI大模型智能体应用,上线“.ai”等40个全新域名后缀

中国域名保有量3160万,以9.4%的份额位居全球第二。 域名资源越来越紧张,运维越来越复杂,面对的网络攻击也越来越频繁,都给这一领域提出了更大挑战。 8月8日,在阿里云万网焕新发布会上,阿里云宣布域名产品服…

waf绕过:网络安全狗绕过

引言: 所有的绕过原理都大致一致,但是并不是所有的绕过都能起到作用,渗透测试主要还是一个猜加试的过程,本文仅供参考 网络攻击或扫描绕过 1.get绕过(未开启cc防护) 网络安全狗的默认防护为,拒…

【C++】模拟实现reverse_iterator(反向迭代器适配器)

🦄个人主页:修修修也 🎏所属专栏:实战项目集 ⚙️操作环境:Visual Studio 2022 目录 一.了解项目功能 📌什么是适配器 📌了解reverse_iterator官方标准 📌了解模拟实现reverse_iterator 二.逐步实现项目功能模块及…

【C++综合项目】——基于Boost库的搜索引擎(手把手讲解,小白一看就会!!)

目录 一、前言 二、项目的相关背景 ⚡什么是Boost库?⚡ ⚡什么是搜索引擎?⚡ ⚡为什么要做Boost搜索引擎?⚡ 二、搜索引擎的宏观原理 三、搜索引擎技术栈和项目环境 四、正排索引 VS 倒排索引 —— 搜索引擎的具体原理 &#x…

leetcode22. 括号生成,DFS深度优先搜索

leetcode22. 括号生成 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。 示例 1: 输入:n 3 输出:[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”] 示例 2&am…

SQL面试题练习 —— 最后一次登录停留时长

目录 1 题目2 建表语句3 题解 题目来源:腾讯微信。 1 题目 有一张用户登录日志表ods_usr_login_log, 包含user_id(用户id)、ds(登录时间)以及stay_time(停留时长,单位:ms) 问题&…

再等等,iPhone 17系列大革新,即将带来颠覆性的升级

自从苹果在2021年的iPhone 13 Pro系列中引入了ProMotion自适应刷新率技术以来,这项技术便成为了高端智能手机显示技术的重要标志。 如今,随着iPhone 17系列即将登场,我们有望见证这项技术向下一代更广泛的设备拓展。不仅如此,iPh…

每日一题~ abc 365 E 异或运算(拆位+贡献)

处理位运算常用的方法: 拆位法(一位一位的处理,通常题目中会给出元素的最大是2的的多少次幂,当然也有给10的次幂的,自己注意一下就可以了) 常用的思想 : 算贡献。 异或的性质: A^A0 …

抖音外卖区域服务商有哪些城市开放了?搭建本地生活系统抢先入局的成功率如何?

随着多家互联网大厂对本地生活重视程度的不断提高,本地生活服务商逐渐成为众多创业者心目中的首选赛道。在此背景下,抖音外卖区域服务商的申请通道一经开放便引发了一阵申请热潮。 毕竟,根据艾瑞咨询数据预测,到2025年&#xff0…

Linux5.15.71编译问题处理

目录 1 编译环境及源码版本2 移植Linux 5.15.71遇到问题2.1 imx-sdma 20ec000.dma-controller: Direct firmware load for imx/sdma/sdma-imx6q.bin failed with error -22.2 cfg80211: failed to load regulatory.db 1 编译环境及源码版本 ​ 1. uboot-alientek-v2022.04 ​…

红酒与亚洲菜肴:品味东方韵味

当西方的红酒遇上东方的菜肴,一场跨越地域与文化的味蕾盛宴就此展开。洒派红酒(Bold & Generous)与亚洲菜肴的相遇,不仅是一场美食的邂逅,更是一次对东方韵味的深度品味。 一、红酒的醇厚与亚洲菜肴的精致 红酒&…

【Unity程序】和【控制台程序】连接【asp.net core的websocket服务】(1)——在编辑器中运行

一、说明 1、本文实验内容所涉及的开发环境说明: win11VisualStudio2022(.Net6.0)Unity2021.3.40 2、本文参考资料 【1】NativeWebSocketUnity包: https://github.com/endel/NativeWebSocket 【2】asp.net core架设websocket国…

【安卓】SharedPreferences存储

SharedPreferences使用键值对的方式来存储数据的。也就是说,当保存一条数据的时候,需要给这条数据提供一个对应的键,这样在读取数据的时候就可以通过这个键把相应的值取出来。而且SharedPreferences还支持多种不同的数据类型存储,…