C++实现中缀表达式转化为后缀表达式详解

yizhihongxing

C++实现中缀表达式转化为后缀表达式详解

中缀表达式是人类一般使用的计算方式,而计算机更习惯于使用后缀表达式进行计算。因此,将中缀表达式转化为后缀表达式是很有必要的。下面就是C++实现中缀表达式转化为后缀表达式的攻略:

步骤一:定义运算符优先级

在将中缀表达式转化为后缀表达式时,需要对每一个运算符赋予优先级,以便在转化过程中确定运算的先后顺序。通常来说,加减法的优先级低于乘除法,则可以将加减法定义为优先级1,乘除法定义为优先级2。

既然要定义运算符的优先级,可以考虑使用map来实现。例如,在C++中可以用以下代码定义优先级:

map<char, int> priority = {{'+', 1}, {'-', 1}, {'*', 2}, {'/', 2}};//运算符优先级

步骤二:将中缀表达式转化为后缀表达式

将中缀表达式转化为后缀表达式需要使用到栈。从左到右依次扫描中缀表达式,扫描到的是数字时直接将其加入到后缀表达式中,扫描到的是运算符时则需要将其与栈顶元素进行比较。

如果栈顶运算符的优先级大于当前元素运算符的优先级,则弹出栈顶元素并加入到后缀表达式中,如此重复,直至栈顶元素的优先级小于当前元素运算符的优先级或者栈已经为空,则将当前元素压入到栈中;如果栈顶元素的优先级小于或等于当前元素运算符的优先级,则直接将当前元素压入到栈中。

上述过程可以使用以下代码实现:

vector<string> infix2postfix(string& s) {
    stack<char> stk;
    vector<string> ans;
    for(int i=0; i<s.size(); ) {
        if(isdigit(s[i])) {
            string num;
            while(i<s.size() && isdigit(s[i])) num+=s[i], i++;
            ans.push_back(num);
        } else if(s[i]=='+' || s[i]=='-' || s[i]=='*' || s[i]=='/') {
            while(!stk.empty() && priority[stk.top()] >= priority[s[i]]) {
                ans.push_back(string()+stk.top());
                stk.pop();
            }
            stk.push(s[i]), i++;
        } else i++;
    }
    while(!stk.empty()) ans.push_back(string()+stk.top()), stk.pop();
    return ans;
}

示例一:

输入:3+4*2/(1-5)^2^3

输出:3 4 2 * 1 5 - 2 3 ^ ^ / +

示例二:

输入:(10+2)4/((5-3)2)

输出:10 2 + 4 * 5 3 - 2 * /

总结

将中缀表达式转化为后缀表达式可以使用栈来实现,需要将运算符定义优先级以便在转化过程中确定运算的先后顺序,同时还需要注意扫描到的是数字还是运算符。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++实现中缀表达式转化为后缀表达式详解 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 大神F1极速版UI对比红米2哪个好?酷派大神F1极速版UI与红米2区别评测

    大神F1极速版UI对比红米2 概述 大神F1极速版和红米2都是市面上比较流行的手机,但它们的UI(用户界面)有很大的不同。在选购手机时,UI是一个很重要的考虑因素,因为它直接关系到用户体验。 大神F1极速版UI 大神F1极速版的UI非常精致,采用了橙色为主色调。界面设计简约,非常符合年轻人的审美。大神F1极速版的UI采用了骁龙移动平台,可以实现高效、稳定、流…

    other 2023年6月27日
    00
  • 31. Ubuntu15.04系统中如何启用、禁用客人会话

    Ubuntu15.04系统中如何启用、禁用客人会话 在Ubuntu 15.04及以后的版本中,系统默认启用了客人会话,允许未登录的用户使用系统,这在公共场所和学校等场合非常有用。但在某些情况下,您可能希望禁用这个功能,以保护系统和数据的安全性。本文将介绍如何在Ubuntu 15.04系统中启用或禁用客人会话。 1. 启用客人会话 默认情况下,Ubuntu 1…

    其他 2023年3月28日
    00
  • Python底层封装实现方法详解

    Python底层封装实现方法详解 Python是一种高级动态类型语言,其封装特征是其面向对象编程的一大特性。Python中的封装是通过各种机制来隐藏对象的实现细节,让外部使用者只能通过特定的接口来进行访问和修改。在本篇文章中,我们将介绍Python中封装的实现方法,包括类的访问权限修饰符、属性方法等。 访问权限修饰符 在Python中,我们可以使用以下访问权…

    other 2023年6月25日
    00
  • MySQL修改表一次添加多个列(字段)和索引的方法

    MySQL修改表一次添加多个列(字段)和索引的方法 在MySQL中,我们可以使用ALTER TABLE命令通过一次查询语句来一次性添加多个列(字段)和索引。这种方式非常便捷,能够提高我们的工作效率。 添加列(字段) 使用ALTER TABLE来添加列(字段)可以使用ADD COLUMN关键字,具体语法如下: ALTER TABLE 表名 ADD COLUMN…

    other 2023年6月25日
    00
  • 操作系统的功能

    操作系统是一种管理计算机硬件与软件资源的系统软件。它可以协调不同的应用程序、管理系统资源,以及处理计算机的输入与输出等操作,使得计算机可以更加高效、稳定地运行。 操作系统的主要功能如下: 进程管理 操作系统负责分配和管理计算机系统的进程,确保它们在不同的阶段下拥有足够的资源和优先级。例如,在一个多任务系统中,操作系统可以保证计算机的 CPU 时间被正确地分配…

    其他 2023年4月16日
    00
  • java Nio使用NioSocket客户端与服务端交互实现方式

    下面是Java NIO使用NioSocket客户端与服务端交互的完整攻略: 1. NioSocket客户端与服务端交互实现方式 Java NIO是Java SE 1.4版本提供了基于缓冲区、非阻塞IO的IO操作API,支持高并发、高效率的IO操作。在NIO中,核心的概念有缓冲区、通道、选择器。 要建立客户端与服务端的交互,需要使用SocketChannel类…

    other 2023年6月25日
    00
  • Microsoft VBScript 编译器错误 错误原因 代码大全

    Microsoft VBScript 编译器错误指的是使用VBScript语言编写的代码在编译运行过程中出现的异常情况。以下是错误原因和代码大全: 错误原因 1.语法错误:VBScript脚本语言非常严格,语法错误包括变量拼写错误、语句缺失、不完整的括号等。 2.类型不匹配:VBScript是一种弱类型语言,这意味着如果变量的值和使用的对象类型不一致,会导致…

    other 2023年6月26日
    00
  • 小米手机怎么快速清理内存空间?

    小米手机快速清理内存空间攻略 清理内存空间可以帮助小米手机提高性能和运行速度。以下是一些快速清理内存空间的方法: 方法一:使用内置的清理工具 小米手机提供了内置的清理工具,可以帮助您快速清理内存空间。按照以下步骤进行操作: 打开手机设置。 滑动屏幕并找到“存储”选项,点击进入。 在存储页面中,您将看到一个“清理”按钮,点击它。 系统将扫描您的手机并列出可以清…

    other 2023年7月31日
    00
合作推广
合作推广
分享本页
返回顶部