中缀转后缀

概念

  • 什么是后缀表达式?
    • 后缀表达式,其实就是一个中缀表达式 AOB => ABO (A、B是式子、O 为运算符),将运算符向后放

中转后举例

  • 中缀表达式:(a + b)* c - (d / c)

    • 首先,我们可以看到,在这个算式中,根据运算规则最先运算的是 括号中的内容,也就是 (a + b), 根据概念,此时 A = a、 B = b、 O = +,AOB=>ABO=>ab+

    • 其次,我们将 (ab+) 看作一个整体,式子变成 (ab+)c - (d/c),根据运算规则和优先级,我们可以发现接下来要运算的是 * , 此时A = (ab+)、 B = c 、O = * , AOB => ABO => ab+c

    • 紧接着,此式变成了 (ab+c*) - (d/c),根据运算规则和优先级,我们可以发现接下来要运算的是 / ,那么此时 A=d、B=c、O=/ 。AOB=>ABO=>dc/

    • 最后,此式变成了,(ab+c*) - (dc/),我们可以发现接下来要运算的是 - ,那么此时 A=(ab+c*)

      B= (dc/), O=- 。AOB=>ABO=>ab+c*dc/-(后缀表达式)

综上,我们可以看出,其实中缀转后缀,就是根据运算规则,找到我们表达式中最先计算的两项和运算符,然后,将其运算符放后边,并且要保持 A 和 B 的相对顺序不变,依次执行,直到转化成后缀表达式

中缀转后缀过程

详细规则:

  • 初始化一个栈,存储 运算符
  • 从左到右扫描(依次向后放字符)
    1. 遇到操作数。直接加入后缀表达式
    2. 遇到界限符。遇到 “(” 直接入栈,遇到 “)” 则依次弹出栈内运算符并加入后缀表达式,直到弹出 “(” 为止 。注意:“( )” 不加入后缀表达式
    3. 遇到运算符。依次弹出栈中优先级高于或者等于当前运算符的所有运算符,并加入后缀表达式,若碰到 “(” 或 栈空则停止。之后再把当前运算符入栈。
    4. 处理完所有字符后,将栈中剩余运算符依次弹出,并加入后缀表达式

详细执行过程:

Code

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_SIZE 100

// 运算符优先级函数
int precedence(char op) {
    if (op == '+' || op == '-') {
        return 1;
    } else if (op == '*' || op == '/') {
        return 2;
    } else {
        return 0;
    }
}

// 中缀转后缀实现
void infix_to_postfix(char* infix, char* postfix) {
    char stack[MAX_SIZE];						// 定义一个栈,用来存放 运算符
    int top = -1;								// 定义 栈顶指针
    int i, j;
    
    // 遍历中缀字符数组
    for (i = 0, j = 0; infix[i] != '\0'; ++i) {
        // 判断,如果是字符,将其存入后缀字符数组中
        if (infix[i] >= 'a' && infix[i] <= 'z') {
            postfix[j++] = infix[i];
        } else if (infix[i] == '(') {				// 如果是 左括号,放入栈中
            stack[++top] = infix[i];	
        } else if (infix[i] == ')') {				// 如果是 右括号
            // 将栈中 左括号之前的 运算符依次弹出,并进入后缀数组中
            while (top != -1 && stack[top] != '(') {
                postfix[j++] = stack[top--];
            }
            // 再减一次是为了:弹出 左括号
            top--; 
        } else {
            // 栈不空,并且当栈顶运算符优先级 大于等于 扫描到中缀运算符优先级,将栈中元素依次弹出,放入后缀数组中
            while (top != -1 && precedence(stack[top]) >= precedence(infix[i])) {
                postfix[j++] = stack[top--];
            }
            // 再将,扫描到中缀运算符,放入栈中
            stack[++top] = infix[i];
        }
    }
    
    // 当扫描完后,将栈中元素依次弹出,并放入后缀表达式数组中
    while (top != -1) {
        postfix[j++] = stack[top--];
    }
    
    // 设置字符数组结束符
    postfix[j] = '\0';
}

int main() {
    char infix[MAX_SIZE];
    char postfix[MAX_SIZE];
    
    printf("输入中缀表达式: ");
    scanf("%s", infix);
    
    infix_to_postfix(infix, postfix);
    
    printf("后缀表达式是: %s\n", postfix);
    
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

jupyter notebook找不到自己创建的环境 无法识别 解决方法

问题描述&#xff1a; 这是最近遇到的一个关于Anaconda的小问题。 用conda创建一个名为 pytorch 的环境想学习pytorch&#xff0c;安装完一切之后在 jupyter 中找不到 pytorch 这个虚拟环境&#xff0c;与之相关的库也都无法调用 解决方法&#xff1a; 实际上是由于在虚拟环境…

DevOps落地笔记-12|API管理:微服务时代的必备工具

上一课时主要介绍了使用持续集成这个实践来保证开发中的软件处于可工作的状态&#xff0c;解决的是开发后期才集成导致的无法集成或功能无法使用的问题。 最近几年&#xff0c;软件架构也在不断升级&#xff0c;逐渐采用前后端分离、微服务的体系结构。前后端分离使得前端和后…

使用API有效率地管理Dynadot域名,使用API进行域名平台内转移(Push)命令

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…

非精线搜索步长规则Armijo规则Goldstein规则Wolfe规则

非精确线搜索步长规则 在数值优化中&#xff0c;线搜索是一种寻找合适步长的策略&#xff0c;以确保在目标函数上获得足够的下降。如最速下降法&#xff0c;拟牛顿法这些常用的优化算法等&#xff0c;其中的线搜索步骤通常使用Armijo规则、Goldstein规则或Wolfe规则等。 设无…

介绍一款可以对书签分类的手机浏览器

DT浏览器是一款专为手机安卓系统设计的小型、快速且安全的浏览器&#xff0c;其中一个显著特点是对安卓系统的各个版本具有良好的自适应性&#xff0c;这意味着用户无论使用的是新型还是旧型手机&#xff0c;都可以顺畅地使用DT浏览器。为了提高用户的使用便利性&#xff0c;DT…

牛客寒假训练营H题

思路&#xff1a;找出所有m的子集&#xff0c;加到价值中&#xff0c;找出最大价值即可。 代码&#xff1a; void solve(){int n, m;cin >> n >> m;vector<pii>a(n 1);for(int i 1;i < n;i )cin >> a[i].first >> a[i].second;int ans 0…

2024年【安全员-C证】新版试题及安全员-C证复审考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全员-C证新版试题参考答案及安全员-C证考试试题解析是安全生产模拟考试一点通题库老师及安全员-C证操作证已考过的学员汇总&#xff0c;相对有效帮助安全员-C证复审考试学员顺利通过考试。 1、【多选题】《企业安全…

【初中生讲机器学习】4. 支持向量机算法怎么用?一个实例带你看懂!

创建时间&#xff1a;2024-02-02 最后编辑时间&#xff1a;2024-02-03 作者&#xff1a;Geeker_LStar 你好呀~这里是 Geeker_LStar 的人工智能学习专栏&#xff0c;很高兴遇见你~ 我是 Geeker_LStar&#xff0c;一名初三学生&#xff0c;热爱计算机和数学&#xff0c;我们一起加…

华为机考入门python3--(5)牛客5-进制转换

分类&#xff1a;数字 知识点&#xff1a; 十六进制转int num int(hex_num, 16) int转十六进制 hex_num hex(num) 题目来自【牛客】 hex_num input().strip() dec_num int(hex_num, 16) print(dec_num) by 软件工程小施同学

python爬虫5

1.selenium交互 无页面浏览器速度更快 #配置好的自己不用管 from selenium import webdriverfrom selenium.webdriver.chrome.options import Optionschrome_options Options()chrome_options.add_argument(‐‐headless)chrome_options.add_argument(‐‐disable‐gpu)# path…

2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模

上一篇已经对赛题进行详细分析了&#xff0c;而且大方向和基本的模型已经确定完毕&#xff0c;数据集都已经找到了&#xff0c;现在最重要的就是要分析风暴数据集以及建立时序预测模型&#xff0c;使用气候模型预测的数据&#xff0c;评估气候变化对未来极端天气事件频率和强度…

世界顶级汽车品牌源代码遭泄露 详解源代码凭据安全解决方案

源代码凭据安全&#xff0c;您别忽视 !!! 一、事件回顾 2024年1月29日&#xff0c;RedHunt 实验室的研究员Lohit爆料&#xff1a;某世界顶级的豪华汽车品牌源代码面临泄露风险&#xff01;人为错误致GitHub令牌事故引发重大安全担忧。 RedHunt Labs在一次互联网扫描时&#x…

顺序表:数据结构的建筑积木

朋友们大家好啊&#xff0c;本节内容我们进入数据结构的第二节&#xff0c;顺序表有关内容&#xff0c;同步我们会学习计组原理与cpp相关知识&#xff0c;求三连啊&#xff01; 本节我们重点探讨动态顺序表关于插入数据和删除数据的多种情况的分析 顺序表 线性表顺序表静态顺序…

2024年2月4日 十二生肖 今日运势

小运播报&#xff1a;2024年2月4日&#xff0c;星期日&#xff0c;农历腊月廿五 &#xff08;癸卯年乙丑月戊戌日&#xff09;&#xff0c;法定工作日。 红榜生肖&#xff1a;兔、马、虎 需要注意&#xff1a;牛、鸡、龙 喜神方位&#xff1a;东南方 财神方位&#xff1a;正…

linux中的makefile

(码字不易&#xff0c;关注一下吧w~~w&#xff09; makefile文件是用来管理项目文件&#xff0c;通过执行make命令&#xff0c;make就会解析并执行makefile文件。 命名&#xff1a;makefile或者Makefile 规则&#xff1a; 目标文件&#xff1a;依赖文件 &#xff08;tab)命…

Jetpack Compose系列(3)-使用列表

使用列表 在 View 体系中&#xff0c;创建自定义布局必须扩展 ViewGroup 并实现测量和布局函数。在 Compose 中&#xff0c;只需使用 Layout 可组合项编写一个(布局)函数即可。上一篇文章我们详细介绍了Column()和Row()这两各横向布局&#xff0c;这里我们继续介绍其他布局。 …

LeetCode:42. 接雨水

42. 接雨水 1&#xff09;题目2&#xff09;思路3&#xff09;代码4&#xff09;结果 1&#xff09;题目 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height …

Jmeter学习系列之四:测试计划元素介绍

测试计划元素 JMeter包含各种相互关联但为不同目的而设计的元素。在开始使用JMeter之前&#xff0c;最好先了解一下JMeter的一些主要元素。 注意:测试计划包含至少一个线程组。 以下是JMeter的一些主要组件: 测试计划&#xff08;Plan&#xff09;线程组(Thread Group)控制器…

每日OJ题_算法_模拟③_力扣6. Z 字形变换

目录 力扣6. Z 字形变换 解析代码 力扣6. Z 字形变换 6. Z 字形变换 难度 中等 将一个给定字符串 s 根据给定的行数 numRows &#xff0c;以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时&#xff0c;排列如下&#xff…

C# 读取文件中的配置信息

文章目录 定义使用文件格式代码 C#读取文件并处理&#xff1b;C# 读取文件中的配置信息。 在有的程序中&#xff0c;需要从本地文件中读取配置信息&#xff0c;以进行初始化。 定义 定义一个静态函数来获取文件信息。StreamReader 类。 /// <summary> /// 读取参数文件…