MT3035 逆波兰式

news2024/9/22 8:25:06

 思路:

两个栈str1和sr2,分别存放运算符和结果。

如果是数字,直接放入str2中。

如果是运算符:

1. ( :直接放入   str1

2. +/-/*// 看栈顶元素,若当前字符优先级比栈顶大,则压到str1中;否则str1中元素出栈压到str2中直到当前字符优先级比栈顶大,再把当前字符压到str1中。

3. ) :str1元素依次出栈压到str2中,直到碰见( 。  

例子:8-(3+2*6)/5+4

str1:                                             str2: 8           

str1:-                                            str2: 8           

str1:-  (                                         str2: 8   

str1:-  (                                         str2: 8 3   

str1:-  ( +                                      str2: 8 3   

str1:-  ( +                                      str2: 8 3 2 

str1:-  ( +  *                                   str2: 8 3 2 

str1:-  ( +  *                                   str2: 8 3 2 6

此时遇见):

str1:-                                             str2: 8 3 2 6 * +

str1:-  /                                          str2: 8 3 2 6 * +

str1:-  /                                          str2: 8 3 2 6 * + 5

此时遇见+,因为str1栈顶为/,所以要把/放到str2;str1栈顶此时为-,因为+不比-优先级高,所以-也放入str2中:

str1: +                                        str2: 8 3 2 6 * + 5  / -

str1: +                                        str2: 8 3 2 6 * + 5  / - 4

最后把str1中元素依次压到str2中:

str1:                                          str2: 8 3 2 6 * + 5  / - 4 +

所以最后str2中元素逆序出栈即为逆波兰式。

代码:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 1e6 + 10;
bool is_op(char c)
{
    return c == '+' || c == '-' || c == '*' || c == '/';
}
int prority(char op)
{
    if (op == '+' || op == '-')
        return 1;
    if (op == '*' || op == '/')
        return 2;
    return -1;
}
void process_op(string s)
{ // 后缀表达式的求值
    stack<int> st;
    bool change = false; // 记录是否需要打印
    for (int i = 0; i < s.length(); i++)
    {
        if (is_op(s[i]))
        {
            int r = st.top();
            st.pop();
            int l = st.top();
            st.pop();
            switch (s[i])
            {
            case '+':
                st.push(l + r);
                break;
            case '-':
                st.push(l - r);
                break;
            case '*':
                st.push(l * r);
                break;
            case '/':
                st.push(l / r);
                break;
            }
            change = true; // 计算,需要打印
        }
        else
        {
            st.push(s[i] - '0'); // 数字入栈
            change = false;      // 不需打印
        }
        if (change)
        { // 打印后缀表达式
            stack<int> temp1, temp2;
            temp1 = st;
            while (!temp1.empty())
            { // 将栈中元素倒序
                temp2.push(temp1.top());
                temp1.pop();
            }
            while (!temp2.empty())
            { // 打印计算的前半段
                cout << temp2.top() << " ";
                temp2.pop();
            }
            for (int j = i + 1; j < s.length(); j++)
            { // 打印未计算的后半段
                cout << s[j] << " ";
            }
            cout << endl;
        }
    }
}
string toRPN(string s)
{                   // 中缀转后缀
    stack<char> st; // 结果栈
    stack<char> op; // 操作数栈
    for (int i = 0; i < s.size(); i++)
    {
        if (s[i] == '(')
        {
            op.push(s[i]);
        }
        else if (s[i] == ')')
        {
            while (op.top() != '(')
            {
                st.push(op.top());
                op.pop();
            }
            op.pop(); // 弹出'('
        }
        else if (is_op(s[i]))
        {
            while (!op.empty() && prority(op.top()) >= prority(s[i]))
            { // 当前符号不比栈顶符号优先级高
                st.push(op.top());
                op.pop();
            }
            op.push(s[i]);
        }
        else // 数字
        {
            st.push(s[i]);
        }
    }
    while (!op.empty())
    { // 最后把op中的符号全部弹出压入st
        st.push(op.top());
        op.pop();
    }
    // 逆序放到ans中
    string ans;
    int len = st.size();
    while (len--)
    {
        ans = st.top() + ans;
        st.pop();
    }
    return ans;
}
int main()
{
    string s;
    cin >> s;
    string s2 = toRPN(s); // 存放逆波兰式
    for (int i = 0; i < s2.length(); i++)
    {
        cout << s2[i] << " ";
    }
    cout << endl;
    process_op(s2);
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1678618.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【STL】string

本节博客主要是介绍了一下CPP标准库中的string这一容器的相关用法和常用接口&#xff0c;有需要借鉴即可。 目录 1.string介绍1.1CPP标准库与STL关系1.2string历史问题与介绍 2.string概要3.Member functions3.1constructor3.2operator 4.访问4.1[]访问4.2迭代器访问4.3范围for…

软件测试的一些概念

一.基本概念 1.什么事需求 1&#xff09;需求的定义 用户需求&#xff1a;可以简单理解为甲方提出的需求&#xff0c;如果没有甲方&#xff0c;那么就是终端用户使用产品时&#xff0c;必须完成的任务&#xff0c;该需求一般比较简略 软件需求&#xff1a;或则叫功能需求&a…

【Amplify_自己写的shadr遇到没有阴影的解决方案】

Amplify 自己写的shadr遇到没有阴影的解决方案 2020-01-21 16:04 本来我有个百试很灵的投射阴影脚本。 这次不灵光了&#xff01;地形内建材质&#xff0c;这个不支持投射的阴影~~奇了怪了。 可以采用引用的方式UsePass加入阴影部分代码&#xff0c;具体操作如下&#xff1…

视觉SLAM14精讲——三维空间刚体运动1.2

三维空间刚体运动 欧拉角 欧拉角可以说是零理解成本的表示形式&#xff0c;由于有万向锁的问题被绝大部分项目所抛弃。欧拉角的每个轴旋转都有固定好的名称&#xff0c;这些名称十分直观&#xff1a; Z轴旋转&#xff0c;相当于左右旋转&#xff0c;叫航角&#xff0c;或偏航…

photoshop(PS)有什么快速提升工作效率的功能?或者实用功能?这里告诉你5条!

1:文件太多&#xff0c;不方便马上找到需要插入元素&#xff08;元素放入PS会发现&#xff0c;位置不知道在哪里&#xff09;&#xff0c;点击需要选中或者搭配的元素&#xff0c;ctrlV就可以快速插入目标/图层元素的位置了&#xff01; 点击当前元素&#xff0c;选中&#xf…

全局异常处理实现

全局异常统一处理 ​ 全局异常处理类通常用于捕获和处理应用程序中发生的所有异常&#xff0c;从而避免在代码的多个地方重复编写异常处理逻辑。 一、全局异常处理方案 ​ 全局异常处理类有多种实现方式&#xff0c;每种方式都有其特定的应用场景和优势。以下是几种常见的全…

Vitis HLS 学习笔记--理解串流Stream(1)

目录 1. 介绍 2. 示例 2.1 代码解析 2.2 串流数据类型 2.3 综合报告 3. 总结 1. 介绍 在Vitis HLS中&#xff0c;hls::stream是一个用于在C/C中进行高级合成的关键数据结构。它类似于C标准库中的std::stream&#xff0c;但是专门设计用于硬件描述语言&#xff08;如Veri…

vue使用marked和highlight.js实现代码高亮效果

marked是对markdown进行解析的插件&#xff0c;它可以把markdown语法解析成html语法&#xff0c;从而实现页面效果&#xff0c;而highlight.js是对解析出的代码实现高亮效果 效果&#xff1a; 安装&#xff1a;避免踩我走的坑&#xff0c;安装尽量按照这个版本安装 npm install…

【Linux网络编程】IO多路转接之poll

poll 1.poll初始2.poll函数接口3.poll服务器4.poll的优点缺点 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f603; 1.poll初始 poll也是一种linux…

物联网D4——OLED显示屏

OLED简介 调试方式 SCL和SDA端口 在STM32微控制器中&#xff0c;SCL代表Serial Clock&#xff08;串行时钟线&#xff09;&#xff0c;它是IC&#xff08;Inter-Integrated Circuit&#xff09;总线协议的两个信号线之一。IC总线是一种常用的双向同步串行通信接口&#xff0c;…

el-tooltip 提示框样式修改?

【element-plus el-tooltip官网地址&#xff1a; Tooltip 文字提示 | Element Plus】 <el-tooltippopper-class"Tooltip":content"content"placement"top"effect"light" ><span class"content">{{ content }}&l…

Leecode热题100---3:无重复字符的最长子串

题目&#xff1a;给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串的长度。 C&#xff1a; 指针法&#xff0c;使用at读取字符串中的值&#xff1b; #include <iostream> #include <string> #include <vector> #include <windows.…

Image Sensor固定模式噪声(FPN)的消除方法

本文介绍Image Sensor固定模式噪声&#xff08;FPN&#xff09;的消除方法。 固定模式噪声&#xff08;FPN&#xff09;英文全称&#xff1a;Fixed Pattern Noise&#xff0c;在Image Sensor调试过程中还是比较常见的&#xff0c;它的特点是噪声位置固定不变&#xff0c;不随采…

echarts树图 改文本显示的地方的样式

树图改文本显示的时候的样式 虽然有点越改越丑 其中有一些失败的尝试 forammter 无法识别html元素 所以对于tooptips有用的html元素定义获取返回在这里写的话是不生效的 rich配置项里面的backgroundColor官方说支持 html元素和canvas元素 已经图片url 没有详细试验 官网地址 h…

vue3+ts(<script setup lang=“ts“>)刷新页面后保持下拉框选中效果

效果图&#xff1a; 代码&#xff1a; <template><div class"app-layout"><div class"app-box"><div class"header"><div class"header-left"></div><div class"title">室外智…

K8s 二进制部署 上篇

一 K8S按装部署方式&#xff1a; ① Minikube Minikube是一个工具&#xff0c;可以在本地快速运行一个单节点微型K8S&#xff0c;仅用于学习、预览K8S的一些特 性使用。 部署地址&#xff1a;https://kubernetes.io/docs/setup/minikube ② Kubeadmin Kubeadmin也是一个工…

简单聊聊分布式和集群

前言 分布式和集群&#xff0c;我们都听的比较多&#xff0c;分布式系统和集群的概念对于刚进入职场的小伙伴可能不是很清楚&#xff0c;这篇文章我们就一起看看两者到底是什么&#xff0c;有什么区别。 什么是分布式系统&#xff1f; 先看下书面解释&#xff1a; 分布式系统…

【easyX】动手轻松掌握easyX 1

01 简单绘图 在这个程序中&#xff0c;我们先初始化绘图窗口。其次&#xff0c;简单绘制两条线。 #include <graphics.h>//绘图库头文件 #include <stdio.h> int main() {initgraph(640, 480);//初始化640✖480绘图屏幕line(200, 240, 440, 240);//画线(200,240)…

英语单词量测试

网址&#xff1a;https://preply.com/en/learn/english/test-your-vocab 测试结果&#xff1a; 细节&#xff1a;英语母语者有20000-35000个单词的词汇量&#xff0c;8岁孩子的词汇量在8000个左右。而不是我们教育系统里说的&#xff0c;6000个单词足够用了。足够用&#xff0…