千家信息网

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

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章将为大家详细讲解有关C++如何实现中缀表达式转化为后缀表达式,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.题目描述所谓后缀表达式是指这样的一个表达式:式
千家信息网最后更新 2026年11月03日C++如何实现中缀表达式转化为后缀表达式

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

1.题目描述

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

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

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

2.输入输出

输入样例:

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

输出样例:

248*+88*1+3/+

3.解题思路

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

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

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

I.遇到数字,直接输出

II.遇到运算符:

  • 若为 '(' 直接入栈

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

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

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

4.样例解析

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

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

此时输出 :a

栈的情况:空

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

此时输出 :a

栈的情况:+

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

此时输出 :a b

栈的情况:+

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

此时输出 :a b

栈的情况:+*

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

此时输出 :a b c

栈的情况:+*

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

此时输出 :a b c * +

栈的情况:+

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

此时输出为:a b c * +

栈的情况为:+(

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

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

栈的情况为:+(

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

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

栈的情况为:+(*

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

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

栈的情况为:+(*

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

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

栈的情况为:+(+

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

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

栈的情况为:+(+

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

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

栈的情况为:+

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

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

栈的情况为:+ *

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

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

栈的情况为:+ *

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

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

栈的情况为:空

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

5.代码实现

5.1.优先级确认

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 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 #include #include  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 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++如何实现中缀表达式转化为后缀表达式"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

输出 表达式 情况 优先级 符号 元素 括号 运算 中缀 后缀 运算符 数字 篇文章 接入 C++ 效率 更多 分类 输入 不错 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 手冲咖啡和咖啡机区别 互联网医疗科技 互联网金融科技平台 美国互联网黑科技 广州紫鲸互联网科技 北京大学互联网科技怎么样 茂名市互联网科技产业园 华服互联网科技官网 千方科技属于互联网企业吗 杭州壁岐互联网科技有限公司 中国互联网公司排名锤子科技 洛阳共同富裕互联网科技有限公司 深圳艾果互联网通讯科技 工业互联网山东科技大学 城市宝互联网科技有限公司 新氧科技和美国互联网有关系吗 济南小医互联网科技有限公司招聘 江苏互联网智能科技产品出厂价 广州智享互联网科技 如何强化互联网金融科技 湖南永感互联网科技有限公司 互联网科技资迅 善班互联网科技有限公司 荆州市昕露互联网络科技有限公司 苏州五指互联网络科技有限 和信科技工业互联网 富国互联网科技002692 好易买互联网科技 安徽九吞吴互联网科技有限公司 互联网 科技节活动 微视频大赛
0