返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++如何实现中缀表达式转化为后缀表达式
  • 719
分享到

C++如何实现中缀表达式转化为后缀表达式

2023-06-29 14:06:39 719人浏览 独家记忆
摘要

这篇文章将为大家详细讲解有关c++如何实现中缀表达式转化为后缀表达式,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.题目描述所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象

这篇文章将为大家详细讲解有关c++如何实现中缀表达式转化为后缀表达式,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

1.题目描述

C++如何实现中缀表达式转化为后缀表达式

所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右进行(不用考虑运算符的优先级)。

如:中缀表达式 3*(5–2)+7 对应的后缀表达式为:352-*7+ 。

请将给出的中缀表达式转化为后缀表达式并输出。

2.输入输出

C++如何实现中缀表达式转化为后缀表达式

输入样例: 

2+4*8+(8*8+1)/3

输出样例:

248*+88*1+3/+

3.解题思路

对于中缀表达式转换为后缀表达式,我们需要用以下步骤来解决这个问题:

初始化一个个栈:运算符栈S1

从左往右开始扫描中缀表达式

I.遇到数字,直接输出

II.遇到运算符:

  • 若为 '('  直接入栈

  • 若为 ')'  将符号栈中的元素依次出栈并输出,直到 '(', '(' 只出栈,不输出

  • 若为其他符号,将符号栈中的元素依次出栈并将其输出,直到遇到比当前符号优先级更低的符号或者 '('。将当前符号入栈。

  • 扫描完后,将栈中剩余的符号依次输出。

4.样例解析 

下面以 a + b * c +(d * e + f) * g 为例子来讲讲计算机的转换过程。

从左向右开始遍历表达式,首先遇到a, 直接将其输出

此时输出 :a

栈的情况:空

继续遍历表达式,遇到+,此时栈空,则将其放入栈中

此时输出 :a

栈的情况:+

继续遍历表达式,遇到b,直接将其输出

此时输出 :a b

栈的情况:+

继续遍历表达式,遇到*,因为*的优先级大于栈顶的+,所以将*入栈

此时输出 :a b

栈的情况:+*

继续遍历表达式,遇到c,直接将其输出

此时输出 :a b c

栈的情况:+*

继续遍历表达式,遇到+, 因为+的优先级低于栈顶的*,所以将栈顶的*弹出;然后新的栈顶元素的+与当前的+优先级相同,所以也要将+弹出;然后栈空了,将现在这个+放入栈中

此时输出 :a b c * + 

栈的情况:+

继续遍历表达式,遇到(,直接将其放入栈中,不遇到)不会将(弹出。

此时输出为:a b c * + 

栈的情况为:+(

继续遍历表达式,遇到d,直接将其输出

此时输出为:a b c * + d

栈的情况为:+(

继续遍历表达式,遇到*,因为栈顶为(,不遇到)不将(弹出,故直接将*放入栈中。

此时输出为:a b c * + d

栈的情况为:+(*

继续遍历表达式,遇到e,直接将其输出

此时输出为:a b c * + d e

栈的情况为:+(*

继续遍历表达式,遇到+,因为+比栈顶*的优先级低,故将*弹出;新的栈顶元素为(,不遇到)不弹出(,故将+放入栈中。

此时输出为:a b c * + d e *

栈的情况为:+(+

继续遍历表达式,遇到f,直接将其输出

此时输出为:a b c * + d e *  f

栈的情况为:+(+

继续遍历表达式,遇到),直接将栈中元素依次弹出并输出直到遇到(为止,注意:(弹出但不输出。

此时输出为:a b c * + d e *  f + 

栈的情况为:+

继续遍历表达式,遇到*,因为*的优先级大于栈顶元素+的优先级,故直接将*入栈。

此时输出为:a b c * + d e *  f + 

栈的情况为:+ * 

继续遍历表达式,遇到g,直接将其输出。

此时输出为:a b c * + d e *  f + g

栈的情况为:+ * 

继续遍历表达式,为空,遍历结束。将栈内元素依次弹出。

此时输出为:a b c * + d e *  f + g * +

栈的情况为:空

至此,中缀表达式转后缀已经全部完成,结果为 a b c * + d e *  f + g * +

5.代码实现

5.1.优先级确认

C++如何实现中缀表达式转化为后缀表达式

int priority(char op){    int priority;    if(op == '*' || op == '/') priority = 2;    if(op == '+' || op == '-') priority = 1;    if(op == '(') priority = 0;    return priority;}

5.2.转换函数

//引用符号提高转换效率void Trans(string &str, string &str1){    stack<char> s;    int i;    for(i = 0; i < str.size(); i ++ )    {        //是数字的情况下直接输出        if(str[i] >= '0' && str[i] <= '9' || str[i] >= 'a' && str[i] <= 'z')        {            str1 += str[i];        }        else //不是数字的情况分类讨论进行判断        {            //栈为空时直接入栈            if(s.empty()) s.push(str[i]);            //左括号入栈            else if(str[i] == '(') s.push(str[i]);            //如果是右括号,只要栈顶不是左括号,就弹出并输出            else if(str[i] == ')')            {                while(s.top() != '(')                {                    str1 += s.top();                    s.pop();                }                //弹出左括号,但不输出                s.pop();            }            else             {                //栈顶元素的优先级大于等于当前的运算符,就将其输出                while(priority(str[i]) <= priorty(s.top()))                {                    str1 += s.top();                    s.pop();                    //栈为空,停止                    if(s.empty()) break;                }                s.push(str[i]);            }        }    }    //最后,如果不为空,就把所以的元素全部弹出    while(!s.empty())    {        str1 += s.top();         s.pop();    }}
#include <iOStream>#include <cstring>#include <stack> using namespace std; int priority(char op){    int priority;    if(op == '*' || op == '/') priority = 2;    if(op == '+' || op == '-') priority = 1;    if(op == '(') priority = 0;    return priority;} //引用符号提高转换效率void Trans(string &str, string &str1){    stack<char> s;    int i;    for(i = 0; i < str.size(); i ++ )    {        //是数字的情况下直接输出        if(str[i] >= '0' && str[i] <= '9' || str[i] >= 'a' && str[i] <= 'z')        {            str1 += str[i];        }        else //不是数字的情况分类讨论进行判断        {            //栈为空时直接入栈            if(s.empty()) s.push(str[i]);            //左括号入栈            else if(str[i] == '(') s.push(str[i]);            //如果是右括号,只要栈顶不是左括号,就弹出并输出            else if(str[i] == ')')            {                while(s.top() != '(')                {                    str1 += s.top();                    s.pop();                }                //弹出左括号,但不输出                s.pop();            }            else             {                //栈顶元素的优先级大于等于当前的运算符,就将其输出                while(priority(str[i]) <= priorty(s.top()))                {                    str1 += s.top();                    s.pop();                    //栈为空,停止                    if(s.empty()) break;                }                s.push(str[i]);            }        }    }    //最后,如果不为空,就把所以的元素全部弹出    while(!s.empty())    {        str1 += s.top();         s.pop();    }} int main(){    //输入前缀表达式    string infix;    string postfix;    cin >> infix;        Trans(infix, postfix);        cout << postfix << endl;    return 0;}

关于“C++如何实现中缀表达式转化为后缀表达式”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: C++如何实现中缀表达式转化为后缀表达式

本文链接: https://lsjlt.com/news/325367.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++如何实现中缀表达式转化为后缀表达式
    这篇文章将为大家详细讲解有关C++如何实现中缀表达式转化为后缀表达式,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.题目描述所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象...
    99+
    2023-06-29
  • C++实现中缀表达式转化为后缀表达式详解
    目录1.题目描述2.输入输出3.解题思路4.样例解析 5.代码实现5.1.优先级确认5.2.转换函数1.题目描述 所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运...
    99+
    2024-04-02
  • C++中怎么将中缀表达式转换为后缀表达式
    本篇文章为大家展示了C++中怎么将中缀表达式转换为后缀表达式,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、思路:和中缀表达式的计算类似,只不过不用计算,把表达式输出即可用字符数组存储整行输入的中...
    99+
    2023-06-05
  • Java中缀表达式转后缀表达式流程详解
    目录一、栈1、栈的基本介绍2、栈的底层实现二、中缀表达式转后缀表达式1、拆解中缀表达式2、中缀转后缀的算法3、中缀转后缀代码解析4、对后缀表达式进行计算一、栈 1、栈的基本介绍 栈是...
    99+
    2024-04-02
  • 如何理解前缀,后缀,中缀表达式转化求值问题
    这篇文章主要讲解了“如何理解前缀,后缀,中缀表达式转化求值问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何理解前缀,后缀,中缀表达式转化求值问题”吧!...
    99+
    2024-04-02
  • 后缀表达式的java如何实现
    这篇“后缀表达式的java如何实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“后缀表达式的java如何实现”文章吧。中缀表...
    99+
    2023-07-02
  • C++ 如何使用栈求解中缀、后缀表达式的值
    目录1. 前言2. 中缀表达式2.1 求值流程2.2 演示表达式4*6^(3+3*3-2*3)-8 的求值过程当2.3 编码实现3.后缀表达式4. 中缀转后缀表达式4.1 流程演示4...
    99+
    2022-11-13
    C++中缀 后缀表达式的值 C++ 栈求解表达式的值
  • 详解Java中缀表达式的实现
    目录1.概念2.算法流程3 代码实现1.概念 什么是中缀表达式,什么是后缀表达式 从小学开始学习的四则运算,例如:3+(5*(2+3)+7) 类似这种表达式就是中缀表达式。中缀表达式...
    99+
    2024-04-02
  • 关于后缀表达式的java实现过程
    目录中缀表示法java实现后缀表示法逆波兰表达式的计算方式与中缀记法的转换java后缀表达式的计算实现方法示例代码实现中缀表示法java实现 观察一个普通的算式:3+4*5 我们当然...
    99+
    2024-04-02
  • C#利用后缀表达式解析计算字符串公式
    目录实现简单的数字的加减乘除1、解析公式转为节点信息2、转为后缀表达式3、计算后缀表达式当我们拿到一个字符串比如:20+31*(100+1)的时候用口算就能算出结果为3151,因为这...
    99+
    2023-02-23
    C#解析计算字符串公式 C#解析字符串公式 C#解析字符串 C# 后缀表达式
  • 带你了解Java数据结构和算法之前缀,中缀和后缀表达式
    目录1、人如何解析算术表达式①、求值 3+4-5②、求值 3+4*52、计算机如何解析算术表达式3、后缀表达式①、如何将中缀表达式转换为后缀表达式?一、先自定义一个栈二、前缀表达式转...
    99+
    2024-04-02
  • Golang栈结构和后缀表达式实现计算器示例
    目录引言问题中缀、后缀表达式的计算人利用中缀表达式计算值计算机利用后缀表达式计算值计算后缀表达式的代码实现中缀表达式转后缀表达式转换过程转换的代码实现总结引言 只进行基本的四则运算,...
    99+
    2024-04-02
  • Java数据结构和算法之前缀、中缀和后缀表达式的示例分析
    小编给大家分享一下Java数据结构和算法之前缀、中缀和后缀表达式的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!1、人如何解析算术表达式如何解析算术表达式?或者换种说法,遇到某个算术表达式,我们是如何计算的:①、求...
    99+
    2023-06-28
  • C#怎么利用后缀表达式解析计算字符串公式
    本篇内容介绍了“C#怎么利用后缀表达式解析计算字符串公式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!当我们拿到一个字符串比如:20+31*...
    99+
    2023-07-05
  • 怎么在python中利用后缀表达式实现一个计算器功能
    本文章向大家介绍怎么在python中利用后缀表达式实现一个计算器功能的基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。前缀表达式运算符在数字的前面1 + (2 + 3) * 4 - 5 (中缀)- + 1 * + ...
    99+
    2023-06-06
  • Java 中执行动态表达式语句前中后缀Ognl、SpEL、Groovy、Jexl3
    目录Ognl、SpEL、Groovy、Jexl3一、前中后缀简单描述1、前缀、中缀、后缀表达式(逆波兰表达式)2、中缀表达式3、后缀表达式4、前缀表达式二、OGNL三、SpEL四、J...
    99+
    2024-04-02
  • C#中如何使用Lambda表达式
    本篇文章为大家展示了C#中如何使用Lambda表达式,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。C# Lambda表达式我们从“所有字符串查找包含YJingLee子字符串”说起。在C# 2.0中,...
    99+
    2023-06-17
  • C#中Lambda表达式如何使用
    本篇内容介绍了“C#中Lambda表达式如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、介绍"Lambda表达式&quo...
    99+
    2023-06-30
  • C++ 中如何使用lambda表达式?
    lambda 表达式是 c++++ 中的匿名函数,用于创建一次性的函数。它们通过捕获列表访问外部作用域变量,并可以接收参数和定义返回类型。lambda 表达式通常用于快速创建或在运行时传...
    99+
    2024-04-12
    c++ 作用域
  • python如何实现列表推导表达式
    这篇文章主要为大家展示了“python如何实现列表推导表达式”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“python如何实现列表推导表达式”这篇文章吧。列表推导表达式列表推导表达式是创建列表的...
    99+
    2023-06-27
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作