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

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日

相关文章

  • 多平台密码绕过及提权工具Kon-Boot的使用与防范

    多平台密码绕过及提权工具Kon-Boot的使用与防范 什么是Kon-Boot? Kon-Boot是一种适用于 Windows 和 Linux 系统的密码绕过及提权工具,能够在不知道有效密码的情况下访问系统或以本地管理员身份登录。 Kon-Boot的工作原理是利用系统内存中的漏洞,修改系统内存中的登录认证信息,从而实现密码绕过。它能够在硬盘、U盘、CD/DVD…

    其他 2023年3月28日
    00
  • JS封装转换前后端接口数据格式工具函数下划线<=>大写

    封装转换前后端接口数据格式工具函数是一种非常实用的技巧,可以提高前后端数据传输的效率和易用性。在其中,下划线与大写之间的转换是比较常见的需求。下面是一些具体操作方法: 1. 定义函数 可以先定义一个函数,将下划线和大写之间进行转换。例如,我们可以定义一个名为transform的函数,实现下划线与大写之间的转换: function transform(key,…

    other 2023年6月25日
    00
  • c#listdistinct操作

    c# list distinct操作 在c#中,List<T>是一个常用的集合类型。其中,Distinct()是用于移除List中重复元素的方法。本文将介绍如何使用Distinct()方法和相关注意事项。 语法 public static IEnumerable<TSource> Distinct<TSource>( th…

    其他 2023年3月29日
    00
  • D3.js的基础部分之数组的处理数组的排序和求值(v3版本)

    D3.js的基础部分之数组的处理数组的排序和求值(v3版本) 在D3.js中,处理数组是非常常见的需求。本文将介绍如何使用D3.js的v3版本对数组进行排序和求值。 排序 D3.js提供了d3.ascending和d3.descending方法来排序数组。这两个方法都可以用于排序数字、日期和字符串。 d3.ascending d3.ascending方法用于…

    other 2023年6月25日
    00
  • Java获取登录用户的IP地址示例代码

    当开发一个基于Java的Web应用程序时,有时需要获取登录用户的IP地址。下面是获取登录用户IP地址的示例代码: import javax.servlet.http.HttpServletRequest; public class UserIPUtil { public static String getUserIP(HttpServletRequest r…

    other 2023年7月31日
    00
  • 半小时通透Java的泛型

    半小时通透Java的泛型 Java中的泛型可以在编译时期强制类型检查,提高代码的可读性和可维护性。本篇文章将通过以下几个方面入门讲解Java的泛型。 为何需要泛型 Java是一门强类型语言,变量在声明时就必须指定数据类型。但是,有些场景下程序员无法确定类型,例如:在集合类中存储对象时,使用Object类型无法满足需求,会导致类型转换错误和代码可读性差。针对这…

    other 2023年6月26日
    00
  • vue如何根据不同的环境使用不同的接口地址

    Vue可以通过配置不同的环境变量来实现在不同的环境下使用不同的接口地址。以下是实现的步骤: 1. 创建环境变量配置文件 在Vue项目根目录下创建.env文件,以及.env.development、.env.production等与环境对应的文件。其中,.env是默认的环境配置文件,.env.production文件适用于生产环境,.env.developme…

    other 2023年6月27日
    00
  • 文字识别之藏文识别

    藏文识别是指将藏文图片转换为可编辑的文本格式,以便于后续的处理和分析。以下是藏文识别的完整攻略,包括数据备、模型训练和测试等步骤。 数据准备 数据准备是藏文识别的第一步,需要收集足够的藏图片作为训练集和测试集。可以从互联网上下载一些藏文图片,也可以自己拍摄一些藏文图片。在收集图片时,需要注意几点: 图片质量要好,尽量避免模糊、光线不足等问题。 图片数量要足够…

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