洛谷P1175 表达式的转换(栈的应用)

article/2025/11/6 12:41:58

洛谷 P1175 表达式的转换

链接.
难度:提高+/省选-
标签:模拟,字符串,线性结构,栈

题意:

给定一个中缀表达式,让我们输出转化为后缀表达式后计算的每一步。
image-20210725220714196

题解:

1.将中缀表达式转化为后缀表达式。

2.利用栈,应用后缀表达式的运算法则实现运算。

#include<iostream>
#include<cmath>
#include<vector>
#include<map>
#include <cctype>
#include<stack>
#include<queue>
#include<cstring>
#include<algorithm>
#include<iomanip>
#include<vector>
#include<list>
#define mem(a,n) memset(a,n,sizeof a)
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define SYS system("pause");
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;ll gcd(ll a,ll b){ll d; while(b){ d=b; b=a%b; a=d; } return a;}
ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
ll qpow(ll x, ll y) { ll ans = 1; for (; y > 0; y >>= 1) { if (y & 1)ans *= x; x *= x; } return ans;}
ll qpow(ll x, ll y, int MOD) { ll ans = 1; for (; y > 0; y >>= 1) { if (y & 1)ans = ans*x%MOD; x = x*x%MOD; } return ans;}
void exgcd(int a,int b,int &x,int &y){ if(b==0){ x=1;y=0;return; } exgcd(b,a%b,x,y); int temp=y; y=x-(a/b)*y, x=temp; return;}
int downcheck(int l, int r){ while (l < r){ int mid = l + r >> 1; if ("check(mid)") r = mid; else l = mid + 1; } return l;}
int upcheck(int l, int r){ while (l < r){ int mid = l + r + 1 >> 1; if ("check(mid)") l = mid; else r = mid - 1;} return l;}
int doublecheck(int l,int r){ while(r-l>1e-8){ int mid=(l+r)>>1; if("check(mid)") l=mid; else r=mid;} return l; }const int N = 4e5+10,M=20;
const int inf=0x3f3f3f3f;
const int mod=1e9+7; 
const double pi = acos(-1.0);
int n,t,m,x;
string str[1000];
string res="";//这个函数,用于比较运算符号的优先级
int priority(const char& ch) {  switch(ch) {case '+':case '-':return 1;case '*':case '/':return 2;case '^':return 3;case '(':case ')':return 0;}
}//将中缀表达式转化为后缀表达式
string chance(string s){stack<char>ch;for (int i = 0; i < s.size();i++){if(isdigit(s[i])) res += s[i];else if(s[i]=='(')  ch.push(s[i]);else if(s[i]==')'){while(ch.top()!='('){res += ch.top();ch.pop();}ch.pop();}else{while (!ch.empty() && priority(ch.top()) >= priority(s[i])){res += ch.top();ch.pop();}ch.push(s[i]);}}while (!ch.empty())   // 最后如果栈中还有剩余的字符,直接弹出并输出res += ch.top(), ch.pop();return res;
}//计算各个运算符
int calcNum(const int& a, const int& b, const int& symbol) {switch(symbol) {case '+':return a + b;case '-':return a - b;case '*':return a * b;case '/':return a / b;case '^':return (int)pow(a, b);}
}//计算后缀表达式的计算结果
void calc(const string& s) {list<int> st;for (int i = 0; i < s.size(); i ++)cout << s[i] << ' ';cout << endl;    for (int i = 0; i < s.size(); i++) {if (isdigit(s[i]))  st.push_back(s[i] - '0');else {                int a, b;  a = st.back();st.pop_back();b = st.back();st.pop_back();st.push_back(calcNum(b, a, s[i])); for (list<int>::iterator it = st.begin(); it != st.end(); ++it)cout << *it << ' ';           for (register int j = i + 1; j < s.size(); j ++)cout << s[j] << ' ';           cout << endl;}}
}int main(){IOSstring s;cin >> s;chance(s);calc(res);//SYSreturn 0;
}

http://chatgpt.dhexx.cn/article/72j3MbZZ.shtml

相关文章

如何解决MySQL Workbench中的错误Error Code: 1175

错误描述&#xff1a; 在MySQL Workbench8.0中练习SQL语句时&#xff0c;执行一条update语句&#xff0c;总是提示如下错误&#xff1a; Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY columnTo disab…

1175:除以13

1175&#xff1a;除以13 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 14671 通过数: 8802 【题目描述】 输入一个大于0的大整数N&#xff0c;长度不超过100位&#xff0c;要求输出其除以13得到的商和余数。 【输入】 一个大于0的大整数&#xff0c;长度不超过1…

MySQL报错Error Code:1175--删除/更新数据报错

Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column. To disable safe mode, toggle the option in Preferences -> SQL Editor and reconnect. 因为MySQL运行在safe-updates模式下&#xff0c;该…

JAVA的技术方向

我大致把 JAVA 的复习分为如下几个方向。 JVM&#xff1b; 排序算法和 Java 集合&工具类&#xff1b; 多线程和并发包&#xff1b; 存储相关&#xff1a;Redis 、Elastic Search、MySQL&#xff1b; 框架&#xff1a;Spring&#xff0c;SpringMVC&#xff0c;Spring Bo…

【求职】好未来Java 方向面经

Java 方向面经 一面 2018/9/20 1、项目相关 2、接口和抽象类 3、spring aop ioc 4、场景题 5、手写二叉树镜像 6、Redis 7、数据库高负载怎么办 8、天池大数据比赛 二面 1、项目相关 2、手写两个出现两次的数 3、手写两个出现一次的数 4、想不想转大数据 一面 2…

学Java方向的学生如何找实习的工作?

是这个大三的学生,是学Java方向的,我想知道,实习的工作好找吗?应该会什么?目前会SE、EE,数据库MySQL、 sqlserver。sql语句也会,C语言,c++也会一点。可以用框架做增删改查。这样够了吗? 不好找。 某种意义上来讲,找实习比找工作还要难。 为什么? 你就会一点增删…

推荐10个Java方向最热门的开源项目(8月)

1. JCSprout&#xff08;Java核心知识库&#xff09; Github地址&#xff1a; https://github.com/crossoverJie/JCSproutstar: 12k介绍&#xff1a; 处于萌芽阶段的 Java 核心知识库。 2. Java-Guide &#xff08;Java学习指南&#xff09; Github地址&#xff1a; https:/…

2017 JAVA方向实习要求汇总

微软 阿里巴巴 腾讯 WEB开发 后台开发 百度 软件研发 基础平台研发 JAVA研发 360 企业安全-服务端 手机OS-JAVA CVTE 后台研发 滴滴 软件开发 欢聚时代 Java开发 今日头条 京东 美图 JAVA服务端 JAVA开发 美团点评 后台研发 蘑…

Java有哪些从业方向?分享这9个

现在Java非常热&#xff0c;是因为通过学习Java能够快速的找到工作。那么&#xff0c;Java有哪些从业方向&#xff1f;下面&#xff0c;跟随小千的脚步一起来看看吧。 Java从业方向一&#xff1a;Web开发 Web前端开发工程师是一个很新的职业&#xff0c;是从事Web前端开发工…

Java都有哪些方向可以选择?分享这三个

大家报班学Java一般都是为了找份Java相关的工作&#xff0c;但是在学习完之后很多人都会比较迷茫不知道自己可以找什么样的工作&#xff0c;有哪些岗位是自己可以选择的。所以今天小千就来给大家讲讲Java都有哪些方向可以选择&#xff1f; 学员在学完Java后能够选择的Java岗位…

java方向大数据面试题整理

1.String 和StringBuffer的区别 JAVA平台提供了两个类:String和StringBuffer&#xff0c;它们可以储存和操作字符串&#xff0c;即包含多个字符的字符数据这个String类提供了数值不可改变字符串而这个StringBuffer类提供的字符串进行修改当你知道字符数据要改变的时候你就可以使…

Java研发方向

很多同学在学完Java基本语法后不知道后面要学些什么&#xff0c;也不知道要到底参加哪些的科技竞赛。在这里为大家分析一下Java开发方向到底要学哪些课程。 1、面向对象编程语言Java基础 Java开发方向那么Java语言是必要不可少的一部分&#xff0c;JavaSE&#xff08;Java St…

2022年Java就业方向有哪些?

达到全部需求量的50%以上。而且&#xff0c;Java工程师的薪水相对较高。通常来说&#xff0c;具有3~5年开发经验的工程师&#xff0c;年薪20万是很正常的一个工资。一些重点院校的优秀毕业生能够进入国内一流的IT企业(百度、腾讯、阿里巴巴等)&#xff0c;年薪一般在20万左右&a…

java的工作方向

首先&#xff0c;比较常见的一种是做网站开发。Java语言具有安全性的特点&#xff0c;它的存储分配模型是它防御恶意代码的主要方法之一。基于这一特性&#xff0c;即使Java开发网站的成本比较高也有很多公司会选择用Java语言开发网站。 第二&#xff0c;企业级应用开发。由于J…

作为Java程序员,这九个最具有潜力的发展方向,你都了解吗?

Java语言是一门随时代迅速发展的计算机语言程序,其深刻展示了程序编写的精髓,再加上其简明严谨的结构及简洁的语法编写为其将来的发展及维护提供了保护 。现在Java培训非常热,是因为通过学习Java能够快速的就业。那么,对于拥有Java技术的程序员来说,他们的职业道路是十分宽…

《VS2013 MFC 编程基础(19个专题) 》

链接&#xff1a;https://pan.baidu.com/s/1pmG3xH_RhDtr4H2gNBjbuw 提取码&#xff1a;bbm9

MFC编程 -- 获取鼠标坐标位置

一、源代码 int x GET_X_LPARAM(lParam); int y GET_Y_LPARAM(lParam); TCHAR s[256]; _stprintf_s(s,_countof(s),_T("x坐标&#xff1a;%d,y坐标&#xff1a;%d"),x,y); SetWindowText(hwndDlg, s); 二、函数解析 1、GET_X_LPARAM&#xff1a;获取鼠标x坐标&am…

MFC编程实验(一):菜单及响应(硬币加减)

一、实验要求 实现一个显示钱币叠加的小程序&#xff0c;步骤如下&#xff1a; 建立一个SDI应用程序&#xff1b;在文档类中添加关于钱币个数的数据&#xff1b;在视图中图示化钱币及其数值&#xff1b;通过菜单改变文档类中的钱币数量后&#xff0c;视图上图示化的钱币也得到…

MFC编程 -- 浮点数与字符串之间转换

一、重新涉及界面 二、编写代码 if (nID IDC_JISUAN2){TCHAR str[15];GetDlgItemText(hWnd,IDC_EDIT4,str, _countof(str));double l _tstof(str);GetDlgItemText(hWnd, IDC_EDIT5, str, _countof(str));double r _tstof(str);_stprintf_s(str, _countof(str), _T("%g…

MFC编程 -- 添加菜单

一、新建资源菜单 二、编辑菜单 文件(&F) 新建(&N\tCtrlN) 三、将菜单绑定到窗口 1、在初始化操作实现绑定 case WM_INITDIALOG:窗口初始化(hwndDlg);//窗口启动时运行绑定菜单栏(hwndDlg); break; 2、实现绑定代码 int 绑定菜单栏(HWND hDlg) {auto 菜单句柄Load…