首页 > 其他分享 >中缀表达式转后缀表达式

中缀表达式转后缀表达式

时间:2023-04-01 12:04:48浏览次数:40  
标签:中缀 后缀 栈顶 stk 括号 表达式

中缀表达式转后缀表达式

一、中缀表达式和后缀表达式的区别

中缀表达式就是我们通常认知中的表达式,比如

\[1+((2+3)*4)-5 \]

这样的表达式虽然容易被人所理解,但是不容易被机器所识别,为此推出了 后缀表达式

后缀表达式又被叫做 逆波兰表达式,逆波兰表达式 不需要被括号所识别 ,且容易被机器识别。

二、中缀表达式转后缀表达式的过程

我们随意的拟定一个中缀表达式,比如:

\[1+5*(3+2)-4*5 \]

我们对中缀表达式进行一步一步转换,转换方式如下:

  1. 遇到操作数时直接加入集合
  2. 遇到操作符,与栈顶操作符比较优先级:
  • 如果栈为空,或者 , 栈顶元素为’ \((\)
  • 如果优先级 \(>\)
  • 如果优先级 \(<=\)
  1. 遇到括号时
  • 如果为左括号,直接加入栈
  • 如果为右括号,依次弹出栈顶元素入集合,并且,再次对比,直到遇到左括号,弹出栈顶元素不入集合。

4、最后将栈顶元素依次弹出入集合

做从左向右扫描,转化过程如下:

中缀表达式转后缀表达式_优先级

三、实现代码

#include <bits/stdc++.h>
using namespace std;

//中缀表达式转后缀表达式
/*
测试用例1:
a+b*c+(d*e+f)*g

答案:
abc*+de*f+g*+


测试用例2:
(6+3*(7-4))-8/2

答案:
6 3 7 4 - * + 8 2 / -

测试用例3:
(24*(9+6/38-5)+4)
答案:
24 9 6 38 / + 5 - * 4 +
*/
unordered_map<char, int> h{{'+', 1}, {'-', 1}, {'*', 2}, {'/', 2}};
string s;
string t;
stack<char> stk;
int main() {
    cin >> s;

    for (int i = 0; i < s.size(); i++) {
        //①数字
        if (isdigit(s[i])) {
            int x = 0;
            while (i < s.size() && isdigit(s[i])) {
                x = x * 10 + s[i] - '0';
                i++;
            }
            i--;
            t.append(to_string(x));
        } else if (isalpha(s[i])) //②字符,比如a,b,c
            t.push_back(s[i]);
        else if (s[i] == '(')          //③左括号
            stk.push(s[i]);            //左括号入栈
        else if (s[i] == ')') {        //④右括号
            while (stk.top() != '(') { //让栈中元素(也就是+-*/和左括号)一直出栈,直到匹配的左括号出栈
                t.push_back(stk.top());
                stk.pop();
            }
            stk.pop(); //左括号也需要出栈
        } else {
            //⑤操作符 +-*/
            while (stk.size() && h[s[i]] <= h[stk.top()]) { //哪个操作符优先级高就先输出谁
                t.push_back(stk.top());
                stk.pop();
            }
            stk.push(s[i]); //将自己入栈
        }
    }
    //当栈不为空工,则全部输出
    while (stk.size()) {
        t.push_back(stk.top());
        stk.pop();
    }
    printf("%s", t.c_str());
    return 0;
}****



标签:中缀,后缀,栈顶,stk,括号,表达式
From: https://blog.51cto.com/u_3044148/6163450

相关文章

  • Hangfire 定时任务设置某个时间区间每隔一定时间触发的Cron表达式
    Cron表达式Hangfire使用类似于Linux下的Cron表达式定义时间规则,Cron表达式由6或7个由空格分隔的时间字段组成。Cron表达式时间字段(从左到右依次为):位置时间域名允许值允许的特殊字符1秒0-59,-*/2分钟0-59,-*/3小时0-23,-*/4日期1-31......
  • 常用API(Math,System,Runtime,Object,Objects,BigInteger,BigDecimal,正则表达式)
    常用API(Math,System,Runtime,Object,Objects,BigInteger,BigDecimal,正则表达式)多使用帮助文档类型取值范围和默认值Math类:​ 概念:帮助我们进行数学计算的工具类,里面的方法都是静态的,所以无需实例化这个类​ 常用方法:​ abs::获取绝对值 absExact:获取绝对值 rou......
  • python正则表达式记录
    今天写个脚本用到正则表达式,查阅了资料加问了gpt老师终于解决,在此记录。记录两种正则表达式有用的用法:1、匹配指定了前后文的字符串如我们需要匹配'ontheonehand'中的'one',而不要'ontheotherhand'中的'other';需要用到正则表达式语法中的“特殊构造”:(?...),之所以是特殊构......
  • 定时任务@Scheduled中的cron 表达式和 fixedRated类配置参数
    1.cron表达式格式:@Scheduled(cron="******"){秒数}{分钟}{小时}{日期}{月份}{星期}{年份(可为空)}{秒数} ==>允许值范围:0~59,不允许为空值,若值不合法,调度器将抛出SchedulerException异常"*"代表每隔1秒钟触发;","代表在指定的秒数触发,比如"0,15,45"......
  • 波兰表达式与逆波兰表达式
    波兰表达式与逆波兰表达式1.何为前缀(波兰)、中缀、后缀(逆波兰)表达式1.1前缀表达式前缀表达式是一种没有括号的算数表达式,其与中缀表达式不同的是,运算符写在前面,操作数写在后面。一般形式的(3+4)×5-6即为中缀表达式,该中缀表达式对应的前缀表达式(或称波兰表达式)为:-×+34561.1.......
  • 浅析C++11 lambda表达式用法
    Lambda表达式(匿名函数、Lambda函数)是现代C++在C++11和更高版本中的一个新的语法糖,可以让我们快速便捷的创建一个函数。[capture-list](params)mutableexceptionattribute->return-type{body}capture-list:捕获列表,一般在Lambda表达式开头,捕获上下文中的变量,用......
  • 正则表达式
    一、元字符元字符是构造正则表达式的一种基本元素。.:匹配除换行符以外的任意字符w:匹配字母或数字或下划线或汉字s:匹配任意的空白符d:匹配数字b:匹配单词的开始或结束^:匹配字符串的开始$:匹配字符串的结束匹配有abc开头的字符串:abc或者^abc匹配8位数字的QQ号码:^dddddddd$......
  • java 集合过滤出符合条件的List元素集合(lambda表达式)
    应用场景在项目开发的过程中,我们经常会对List集合进行按条件的过滤,筛选出我们想要的结果或者是符合项目需求的数据。比如:我们有一批学生对象,每个学生都有自己的性别属性,但......
  • lamda表达式?实现函数式接口的缩写
    don'tworry~lamda表达式其实很简单@FunctionalInterfacepublicinterfaceMyInterface{voidprint();}对于一个函数式接口,若想要实现其抽象方法,或许有两种......
  • 正则表达式学习
    第一个: 过滤guid相关的信息egrep^[a-zA-Z0-9]{8}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{12}$ 第二个:反编译代码timeforiin`find.......