中缀表达式转后缀表达式以及表达式的求值

简介: 中缀表达式转后缀表达式以及表达式的求值

文章目录

  • 题目
  • 1.什么是中缀表达式以及后缀表达式
  • 2.中缀表达式转后缀表达式(思维)
  • 3.如何进行表达式求值
  • AC代码


题目

本题链接:表达式求值

image.png

考研对本知识点不要求写出实际代码,但必须掌握思路

本题后续会补充C语言版本,其实就是模拟栈,关于栈的模拟,详见博客:数组模拟栈

目前用C++中自带的STL函数

下面分几个小点进行介绍:

1.什么是中缀表达式以及后缀表达式

2.中缀表达式转后缀表达式(思维)

3.如何进行表达式求值


1.什么是中缀表达式以及后缀表达式

这个举栗子最容易理解:

我们所熟知的计算方法其实就是中缀表达式,如:a + b, a - b, a * b ...

大致概念就是两个数之间用运算符号链接,这就是中缀表达式,那么后缀表达式的概念是不是很容易猜到呢?

a b +, a b -, a b * ...形如这种式子,就被称为后缀表达式,大概意思就是运算符在两个数之后。

这里再举两个对应的中缀表达式和后缀表达式:

中缀表达式:a + b - c,a + b - c * d

后缀表达式:a b + c -,a b + c d * -

其实从这里我们就可以看出,我们的中缀表达式转后缀表达式,数字的顺序(位置)其实是不会发生变化的,只有运算符的顺序(位置)才发生改变


2.中缀表达式转后缀表达式(思维)

这里还是举个栗子:

中缀表达式:((15 / (7 - (1 + 1))) * 3 ) - (2 + (1 + 1))

后缀表达式:15 7 1 1 + - / 3 * 2 1 1 + + -


哈哈哈哈哈哈,是不是看着上面两个等价的前缀和中缀表达式一脸懵,下面讲解怎么把中缀表达式转为后缀表达式:

1.确定中缀表达式中各个运算符的顺序

2.选择下一个运算符,按照 [左操作数 右操作数 运算符] 的方式组合成一个新的操作数

3.如果还有运算符没被处理就继续执行2.


好了,看到这里,你愤怒了,这说了三点说了个啥?看球不懂啊!!!,这写的什么 ** 博客

啊!客官莫急,且听我狡辩! 吓的博主赶紧拿出栗子去说明:

这里我们拿一个基础的栗子:A + B * (C - D) - E / F

我们来给这些符号编一个顺序,拿到上述的中缀表达式之后,我们按照小学思维去考虑:


下面小故事的场景为一个班级中有一位老师(晶姐),两个学生:聪明的博主以及娇妹儿

“同学们看这个表达式,我们应该最先去计算哪一个呀?“

“小括号里面的元素!”(两个人异口同声的说到)

“真聪明,所以我们先计算小括号中的 -,那么接下来呢?”


这时,出现了两种不同的声音:

“先算 *(博主吼道)

“先算 /(娇妹儿吼道)

两人俞吵俞烈,最后老师提出两个人打一架吧(不是

最终,老师同意了 聪明的博主 的建议,先算*


“那么接下来呢?”

“先算 +(博主吼道)

“先算 /(娇妹儿吼道)

显然,博主说的是不容置疑的,故老师选择先计算+

最后一步当然毋庸置疑的先计算/,最后计算-

最终的后缀表达式被写成了:A B C D - * + E F / -


大家可能要为娇妹儿打抱不平了,凭什么娇妹儿说的不对,难道知识因为娇妹儿比博主傻么!?

确实(逃

咳咳咳,其实娇妹儿说的不无道理,做法也是可取的,显然我们的后缀表达式也是可以按照娇妹儿的思维去写的,但是我们这里规定一个原则:左优先原则:只要左边的运算符能先计算,就优先算左边的


为什么呢?

1.计算机内部实现方式为左优先的原则去实现

2.我们用左优先的原则写成后缀表达式之后,是非常直观的,读者可以再看一下我们上述过程中优先计算符号的顺序:- * + / -,恰好这种顺序正好是我们写成后缀表达式之后,后缀表达式中的顺序:A B C D - * + E F / -


看到这里,读者应该明白如何进行中缀表达式以及后缀表达式之间的转换计算了,不妨看一下最开始的栗子,自己动手转换一下看看是否能转换成功


3.如何进行表达式求值

用栈实现后缀表达式的计算

①.从左往右扫描下一个元素,直到完全处理完所有的元素

②.若扫描到操作数则压入栈,并返回到①,否则执行③

③若扫描到运算符则弹出两个栈顶元素 (注:先出栈的为右操作数),执行相应操作,运算结果压回栈顶回到①


若表达式合法,则最后栈中只会留下一个元素,就是最终结果


AC代码

注:考研中其实是不要求会写出下面的代码,但还是希望读者好好看懂并自己写一遍

上面已经说的很详细了(自认为,咳咳),如果代码还有哪里不知道原因的话,可以评论或者私聊我,博主很闲,看到了就会及时回复的

#include <iostream>
#include <cstring>
#include <algorithm>
#include <unordered_map>
#include <stack>
using namespace std;
stack<char> op;
stack<int> num;
void eval()
{
    auto b = num.top(); num.pop();
    auto a = num.top(); num.pop();
    auto c = op.top(); op.pop();
    int x;
    if (c == '+') x = a + b;
    else if (c == '-') x = a - b;
    else if (c == '*') x = a * b;
    else x = a / b;
    num.push(x);
}
int main()
{
    string s;
    cin >> s;
    unordered_map<char, int> pr{{'+', 1}, {'-', 1}, {'*', 2}, {'/', 2}};
    for (int i = 0; i < s.size(); i ++ )
    {
        if (isdigit(s[i]))
        {
            int j = i, x = 0;
            while (j < s.size() && isdigit(s[j]))
                x = x * 10 + s[j ++ ] - '0';
            num.push(x);
            i = j - 1;
        }
        else if (s[i] == '(') op.push(s[i]);
        else if (s[i] == ')')
        {
            while (op.top() != '(') eval();
            op.pop();
        }
        else
        {
            while (op.size() && op.top() != '(' && pr[op.top()] >= pr[s[i]])
                eval();
            op.push(s[i]);
        }
    }
    while (op.size()) eval();
    cout << num.top() << endl;
    return 0;
}



目录
相关文章
|
JSON 算法 安全
不破不立!Fastjson2.0 性能炸裂,为了下一个十年
Alibaba Fastjson: 目前在人类已知范围内,这个星球跑的最快的Java JSON库。在过去的十年里,fastjson v1作为国内github star最多和最受欢迎的json解析库,如今fastjson v2 重磅来袭,性能炸裂。
19252 2
不破不立!Fastjson2.0 性能炸裂,为了下一个十年
|
安全 前端开发 开发工具
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
622 5
【01】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-项目开发实战-优雅草卓伊凡拟开发一个一站式家政服务平台-前期筹备-暂定取名斑马家政软件系统-本项目前端开源-服务端采用优雅草蜻蜓Z系统-搭配ruoyi框架admin后台-全过程实战项目分享-从零开发到上线
|
存储 SQL 监控
计算效率提升 10 倍,存储成本降低 60%,灵犀科技基于 Apache Doris 建设统一数据服务平台
灵犀科技早期基于 Hadoop 构建大数据平台,在战略调整和需求的持续扩增下,数据处理效率、查询性能、资源成本问题随之出现。为此,引入 [Apache Doris](https://doris.apache.org/) 替换了复杂技术栈,升级为集存储、加工、服务为一体的统一架构,实现存储成本下降 60%,计算效率提升超 10 倍的显著成效。
616 0
计算效率提升 10 倍,存储成本降低 60%,灵犀科技基于 Apache Doris 建设统一数据服务平台
中缀表达式转后缀表达式(逆波兰式)
中缀表达式转后缀表达式(逆波兰式)
1608 0
DC电源模块常见的故障和维修方法
1. 无输出电压:可能是输入电源故障、输出线路开路、输出电路短路等。维修方法包括检查输入电源是否正常工作、检查输出线路是否有损伤和修复短路等。
DC电源模块常见的故障和维修方法
|
数据可视化 算法 JavaScript
使用Python进行网络数据可视化的多种方法与技巧
在当今信息爆炸的时代,网络数据量呈指数级增长,了解和分析这些数据对于许多领域的决策制定至关重要。可视化是理解和解释大量数据的强大工具之一,而Python作为一种流行的编程语言,提供了丰富的库和工具来进行网络数据可视化。本文将介绍一些使用Python进行网络数据可视化的方法与技巧,并提供相应的代码实例。
|
Web App开发 JSON JavaScript
浏览器书签bookmark转json格式
一直使用谷歌浏览器,因为某些原因登录谷歌账号不方便,所以公司和家里的浏览器上收藏的好多书签也不能同步,以前都是直接导出来,然后自己手动导入同步
|
安全 数据挖掘 大数据
Dataphin推出“资产消费”功能,助力提升数据分析效率与体验
在数据驱动的时代,企业数据资产的有效管理与高效利用成为了企业数字化转型的关键。面对复杂多变的业务场景和日益增长的数据需求,如何确保数据资产的安全访问、便捷查找与灵活消费,成为众多数据平台负责人的共同挑战。Dataphin,作为一站式大数据智能建设与管理平台,在V4.2版本中全新推出“资产消费”新功能,旨在通过统一权限管理并打通 BI 平台,为企业数据资产管理与消费带来便捷体验。
539 0
|
数据安全/隐私保护
耐震时程曲线,matlab代码,自定义反应谱与地震波,优化源代码,地震波耐震时程曲线
地震波格式转换、时程转换、峰值调整、规范反应谱、计算反应谱、计算持时、生成人工波、时频域转换、数据滤波、基线校正、Arias截波、傅里叶变换、耐震时程曲线、脉冲波合成与提取、三联反应谱、地震动参数、延性反应谱、地震波缩尺、功率谱密度
|
资源调度 测试技术 Apache
YARN中的CPU资源隔离-CGroups
YARN中集成了CGroups的功能,使得NodeManger可以对container的CPU的资源使用进行控制,比如可以对单个container的CPU使用进行控制,也可以对NodeManger管理的总CPU进行控制。
10638 1