iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >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://www.lsjlt.com/news/325367.html(转载时请注明来源链接)

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • c语言怎么计算字符串长度
    在C语言中,可以使用内置的strlen()函数来计算字符串的长度。该函数位于string.h头文件中。以下是一个示例代码: #inc...
    99+
    2024-05-14
    c语言
  • c语言怎么判断三个数的大小
    可以通过比较三个数之间的大小关系来判断它们的大小。以下是一个示例代码: #include <stdio.h> int ...
    99+
    2024-05-14
    c语言
  • c++排序函数sort怎么使用
    在C++中,使用sort函数对容器中的元素进行排序,可以按照默认的升序排列,也可以自定义排序规则。 下面是一个简单的例子,对一个ve...
    99+
    2024-05-14
    c++
  • c++中string的compare函数怎么使用
    在C++中,可以使用string的compare函数来比较两个string对象的大小。该函数的原型如下: int compare(c...
    99+
    2024-05-14
    c++
  • c++中string的compare函数有什么用
    c++中string的compare函数用于比较两个字符串的大小关系。该函数返回一个整数值,表示两个字符串的比较结果。 具体来说,如...
    99+
    2024-05-14
    c++
  • c++中print函数的功能有哪些
    在C++中,通常使用std::cout来进行输出操作,而不是使用print函数。std::cout是C++标准库中的一个输出流对象,...
    99+
    2024-05-14
    c++
  • c语言数据结构怎么使用
    在C语言中,数据结构可以通过定义结构体来实现。以下是一些常见的数据结构的使用方法示例: 链表: #include <std...
    99+
    2024-05-14
    c语言
  • c++中print函数的用法是什么
    在C++中没有内置的print函数,但可以使用cout来输出内容到控制台。cout是C++标准库中的一个输出流对象,可以使用<...
    99+
    2024-05-14
    c++
  • c++中concept的用法是什么
    在C++20中,Concept是一种新的语言特性,用于定义类型要求和约束。Concept可以被用来约束函数模板、类模板和普通函数的参...
    99+
    2024-05-14
    c++
  • c++中concept的作用是什么
    在C++中,concept的作用是定义一种通用的约束,用于限制模板参数的类型范围。通过使用concept,可以在编译时对模板参数进行...
    99+
    2024-05-14
    c++
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作