首页 > 其他分享 >中缀表达式转为逆波兰表达式

中缀表达式转为逆波兰表达式

时间:2024-10-09 16:45:02浏览次数:9  
标签:std 中缀 operators 运算符 token 波兰 output 表达式

中缀表达式转为逆波兰表达式

算法步骤:

  1. 创建一个栈 用于存储运算符。
  2. 输出序列 用于保存转换后的逆波兰表达式。
  3. 遍历中缀表达式的每个字符:
    • 如果是操作数(单字母变量),直接加入输出序列。
    • 如果是左括号 (,则压入栈中。
    • 如果是右括号 ),则弹出栈中的运算符并添加到输出序列,直到遇到左括号。
    • 如果是运算符(如 +、-、*、/),则:
        弹出栈中的运算符到输出序列,直到栈顶运算符的优先级低于当前运算符或栈为空,然后将当前运算符压入栈中。
  4. 处理完所有字符后,将栈中剩余的运算符弹出到输出序列。
    输出结果 为逆波兰表达式。

运算符优先级:

  • + 和 - 的优先级最低,值为 1。
  • * 和 / 的优先级高于 + 和 -,值为 2。
#include <iostream>
#include <stack>
#include <string>
#include <cctype>
#include <unordered_map>

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

std::string infixToPostfix(const std::string& expression) {
    std::stack<char> operators;
    std::string output;

    for (char token : expression) {

        if (std::isalpha(token)) { // 如果是操作数(字母),直接加入输出
            output += token;
        } else if (token == '(') { // 如果是左括号,压入栈
            operators.push(token);
        } else if (token == ')') { // 如果是右括号,弹出栈直到遇到左括号
            while (!operators.empty() && operators.top() != '(') {
                output += operators.top();
                operators.pop();
            }
            operators.pop(); // 弹出左括号
        } else if (precedence(token) > 0) { // 如果是运算符
            while (!operators.empty() && precedence(operators.top()) >= precedence(token)) {
                output += operators.top();
                operators.pop();
            }
            operators.push(token);
        }
    }

    // 弹出剩余的运算符
    while (!operators.empty()) {
        output += operators.top();
        operators.pop();
    }

    return output;
}

int main() {

    std::string postfix = infixToPostfix("a+b*(c-d)");
    std::cout << "posfix: " << postfix << std::endl;

    return 0;
}

标签:std,中缀,operators,运算符,token,波兰,output,表达式
From: https://www.cnblogs.com/AngleLin/p/18454617

相关文章

  • 2-表达式求值
    #include<stdio.h>#include<string.h>#include<string>#include<iostream>#include<algorithm>#include<math.h>#defineeps1e-8usingnamespacestd;boolillegal;chars[10005];intcur=0,n;stringOP="+-*/^";......
  • 对UVM添加超时前的打印信息+AXI低功耗接口+process的await语句+对象当成参数+sv的单例
    对UVM添加超时前的打印信息首先获取到UVM的超时值,然后手动设定\$time的比较和while延时循环,当超出时间后,打印特殊的debug信息。$time<set_time,则进行循环。uvm_cmdline_processorclp;clp=uvm_cmdline_processor::get_inst();stringtimeout_settings[$];stringtimeout......
  • 白骑士的JavaScript教学JavaScript语法基础篇之运算符与表达式 2.2.4 逻辑运算符
            逻辑运算符是用于布尔逻辑运算的符号,它们常用于控制流程和条件判断,帮助程序员编写更复杂和更动态的条件语句。在JavaScript中,主要的逻辑运算符包括逻辑与(‘&&‘)、逻辑或(‘||‘)、逻辑非(‘!‘)以及一些其他特定场景的运算符。逻辑运算符用于将多个布尔值或表达式......
  • 白骑士的JavaScript教学JavaScript语法基础篇之运算符与表达式 2.2.5 条件运算符(三元
            条件运算符,也称为三元运算符,是JavaScript中唯一的三目运算符,它提供了一种简洁的方式来编写条件判断和赋值语句。通过使用条件运算符,你可以在一行代码中实现简单的条件判断,从而让代码更加紧凑和易读。条件运算符        条件运算符由三个部分组成:条件......
  • Python 正则表达式高级应用指南
    正则表达式是一种强大的文本模式匹配工具,在Python中,我们可以使用re模块来进行正则表达式的操作。以下是一些高级的正则表达式应用示例:复杂的模式匹配importretext="Hello,[email protected]."email_pattern=r'\b[......
  • Leetcode 10. 正则表达式匹配
    1.题目基本信息1.1.题目描述给你一个字符串s和一个字符规律p,请你来实现一个支持‘.’和‘*’的正则表达式匹配。‘.’匹配任意单个字符‘*’匹配零个或多个前面的那一个元素所谓匹配,是要涵盖整个字符串s的,而不是部分字符串。1.2.题目地址https://leetcode.c......
  • SpringBoot 多元化配置(正则表达式,配置文件优先级)
    1.配置绑定所谓“配置绑定”就是把配置文件中的值与JavaBean中对应的属性进行绑定。通常,我们会把一些配置信息(例如,数据库配置)放在配置文件中,然后通过Java代码去读取该配置文件,并且把配置文件中指定的配置封装到JavaBean(实体类)中。SpringBoot提供了以下2种方式进行配......
  • 正则表达式和通配符及相关linux命令实操
    正则表达式和通配符含义是完全不同的 正则表达式基本组成: 单引号与双引号在命令中使用单引号,不转义引号内容,原样输出;使用双引号,转义引号内容*并非适用于所有命令 逻辑测试语句&&||!a&&ba执行成功才执行ba||ba执行失败才执行b!aa执行结果取反 》......
  • EL表达式修改js的路径
    request.setAttribute方法用于在Servlet的请求上下文中设置属性,其用途通常是为了在请求的处理过程中传递数据。它与JS路径修改无直接关系,除非你需要在请求处理中修改JS文件的路径并传递给前端页面。如果你需要在Servlet中修改JS路径并通过request.setAttribute传递给JSP页面,你可......
  • 正则表达式和三剑客
    image-20220403163240849什么是正则表达式正则表达式就是为了处理大量的字符串而定义的一套规则和方法。通过定义的这些特殊符号的辅助,系统管理员就可以快速过滤,替换或输出需要的字符串。Linux正则表达式一般以行为单位处理的。image-20220405180916410如何用正则表达式通......