MT3035 逆波兰式

 思路:

两个栈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中的符号全部弹出压入stst.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.xdnf.cn/news/1424725.html

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

相关文章

大模型学习笔记九:模型微调

文章目录 一、什么时候需要Fine-Tuning二、用Hugging Face根据电影评论输出来对电影进行情感分类1)安装依赖2)操作流程3)名字解释4)代码导入库和加载模型、加载数据库、加载tokenlizer5)其他相关公共变量赋值(随机种子、标签集评价、标签转token_Id)6)处理数据集:转成…

乡村振兴与农村基础设施建设:加大投入力度,提升建设水平,完善农村基础设施网络,打造宜居宜业的美丽乡村

一、引言 乡村振兴战略是我国在新时代推进农业农村现代化的重大战略部署&#xff0c;其核心目标是实现乡村的全面振兴&#xff0c;促进农业强、农村美、农民富。农村基础设施建设作为乡村振兴的基石&#xff0c;其建设水平直接关系到乡村经济的持续健康发展、乡村环境的改善以…

每天Get一个小技巧:用DolphinScheduler实现隔几天调度

转载自tuoluzhe8521 这篇小短文将教会你如何使用Apache DolphinScheduler实现隔几天调度&#xff0c;有此需求的小伙伴学起来&#xff01; 1 场景分析 DolphinScheduler定时器模块-定时调度时每3秒|每3分钟|每3天这种定时&#xff0c;不能够跨分钟&#xff0c;跨小时&#x…

信创基础硬件之整机

整机是成套或整体单机、单台形式的机电产品&#xff0c;由硬件系统(hardware system)和软件系统(software system)两部分组成的&#xff0c;包括主板、内存条、硬盘、CPU、光驱、机箱、显示器、键盘、鼠标、音响等部件。 服务器作为在网络环境下为客户机提供各种服务、特殊专用…

【JavaEE】Servlet

文章目录 一、Servlet 是什么二、如何创建Servlet程序1、创建项目2、引入依赖3、创建目录4、编写代码5、打包程序6、部署程序7、验证程序 一、Servlet 是什么 二、如何创建Servlet程序 1、创建项目 2、引入依赖 Maven 项目创建完后&#xff0c;会自动生成一个 pom.xml 的文…

AI 写 SQL 真的靠谱吗?腾讯游戏在 AI+ 湖仓一体的实践

作者&#xff1a;腾讯游戏数据技术负责人 刘岩 导读 腾讯游戏是全球领先的游戏开发和运营商&#xff0c;其数据团队拥有十余年、700 款大型游戏的数据工作沉淀。复杂的业务环境下&#xff0c;腾讯游戏数据团队每年需要处理超过 3 万个数据提取需求&#xff0c;SQL 编写需要耗费…

C++笔试强训day23

目录 1.打怪 2.字符串分类 3.城市群数量 1.打怪 链接 模拟题目&#xff0c;按题意进行模拟就行。 #include <iostream> using namespace std; // 简单模拟 int solve() {int h, a, H, A;cin >> h >> a >> H >> A;if (a > H)return -1;int…

Web浏览器的兼容性测试需要考虑哪些测试点?

测试web网站兼容性时&#xff0c;可以使用各种测试用例来确保网站在不同浏览器中的良好兼容性。以下是一些常见的兼容性测试用例示例&#xff1a; 1. 页面加载测试&#xff1a; - 确保网站在不同浏览器中正常加载&#xff0c;没有加载错误。 - 检查页面加载时间&#xff0c;…

第十四届蓝桥杯大赛软件赛国赛C/C++ 大学 B 组 AB路线

//bfs 1000100010不会超时 #include<bits/stdc.h> using namespace std; #define int long long const int n1e311; int a,b,c,h[n][n][12],k[4][2]{0,1,0,-1,1,0,-1,0}; char t[n][n]; struct s {int x,y,z,w; }; signed main() {ios::sync_with_stdio(false);cin.t…

Day29

回溯算法part03 LC39组合总和(未掌握) 未掌握分析&#xff1a;被数组中的元素可以被重复选取误导&#xff0c;同时没有想到暴力解法来理解回溯 暴力解法肯定是for循环遍历candidates中的每个元素&#xff0c;下一层子循环不像之前的组合题目那样从i1开始&#xff0c;该题目元…

PCIE协议-2-事务层规范-Transaction Ordering

2.4.1 事务排序规则 表2-40定义了PCI Express事务的排序要求。此表中定义的规则适用于PCI Express上的所有事务类型&#xff0c;包括内存、I/O、配置和消息事务。在单个流量类别&#xff08;Traffic Class&#xff0c;TC&#xff09;内&#xff0c;这些排序规则适用。不同TC标…

双向RNN和双向LSTM

双向RNN和双向LSTM 一、双向循环神经网络BiRNN 1、为什么要用BiRNN 双向RNN&#xff0c;即可以从过去的时间点获取记忆&#xff0c;又可以从未来的时间点获取信息,也就是说具有以下两个特点&#xff1a; 捕捉前后文信息&#xff1a;传统的单向 RNN 只能利用先前的上下文信息…

张驰咨询:六西格玛黑带项目的成功关键

六西格玛黑带项目通常被认为是比较难的&#xff0c;因为它们涉及的问题通常比较复杂&#xff0c;可能需要较长时间的分析、实验和协调。然而&#xff0c;通过遵循一定的步骤和方法&#xff0c;可以有效地实施六西格玛黑带项目。 以下是实施六西格玛黑带项目的基本步骤&#x…

搭建Prometheus+grafana监控系统

1. 项目目标 &#xff08;1&#xff09;熟练部署安装node_exporter &#xff08;2&#xff09;熟练部署安装prometheus &#xff08;3&#xff09;熟练部署安装grafana 2. 项目准备 2.1. 规划节点 主机名 主机IP 节点规划 prometheus-server 10.0.1.10 server prome…

【MySQL数据库开发设计规范】之SQL使用规范

欢迎点开这篇文章&#xff0c;自我介绍一下哈&#xff0c;本人姑苏老陈 &#xff0c;是一名JAVA开发老兵。 本文收录于 《MySQL数据库开发设计规范》专栏中&#xff0c;该专栏主要分享一些关于MySQL数据库开发设计相关的技术规范文章&#xff0c;定期更新&#xff0c;欢迎关注&…

3-3 基于RYU的流量风暴事件原理与响应策略

在传统网络中&#xff0c;存在着一定的广播流量&#xff0c;占据了一部分的网络带宽。同时&#xff0c;在有环的拓扑中&#xff0c;如果不运行某些协议&#xff0c;广播数据还会引起网络风暴&#xff0c;使网络瘫痪。 如有以下的一个网络拓扑结构&#xff08;3_2_topoplus.py) …

eMMC和SD模式速率介绍

概述 在实际项目开发中我们常见的问题是有人会问&#xff0c;“当前项目eMMC、SD所使用模式是什么&#xff1f; 速率是多少&#xff1f;”。这些和eMMC、SD的协议中要求的&#xff0c;要符合协议。接下来整理几张图来介绍。 eMMC 模式介绍 一般情况下我们项目中都是会支持到H…

踩坑小结:Linux安装python环境 、安装OpenSSL

一、查看python版本 查看发现&#xff0c;linux上自带了python&#xff0c;不过是2.x版本的。 二、下载python3 2.1 下载 www.python.org/downloads/s… 可在当前目录下找到相对应的版本或者最新版本下载 也可以直接下载 Python 3.10.4 下载完在服务器上选择一个目录存放…

2024 Google I/O大会:全方位解读最新AI技术和产品

引言&#xff1a; 2024年的Google I/O大会如期举行&#xff0c;作为技术圈的年度盛事之一&#xff0c;谷歌展示了其在人工智能领域的最新进展。本次大会尤其引人注目&#xff0c;因为它紧随着OpenAI昨天发布GPT-4o的脚步。让我们详细解析Google此次公布的各项新技术和产品&…

matlab使用教程(71)—控制坐标区布局

1.与位置相关的属性和函数 有几个属性和函数可用于获取和设置坐标区的大小与位置。下表摘要显示了这些属性和函数。 函数或属性描述 OuterPosition 属性 使用此属性可以查询或更改坐标区的外边界&#xff0c;包括标题、标签和边距。要更改外边界&#xff0c;请将此属性指定为…