洛谷【P1175】表达式的转换
浅谈栈:https://www.cnblogs.com/AKMer/p/10278222.html
题目传送门:https://www.luogu.org/problemnew/show/P1175
中缀表达式转后缀表达式之后直接模拟即可。平常我们所用的都是中缀表达式,后缀表达式题面已经说的很清楚了。
至于怎么转?按照一下几条规则用单调栈维护运算符模拟即可:
1、如果当前位是数字,则直接输出
2、如果当前位是左括号,则直接丢栈然后不管
3、如果当前位是运算符,把栈顶优先度不小于当前运算符的全部弹出然后输出,当前运算符入栈
4、如果是右括号,一直弹栈输出直到与之匹配的左括号出栈
优先级:括号>乘方>乘除>加减
时间复杂度:\(O(len^2)\)
空间复杂度:\(O(len)\)
代码如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef pair<int,int> pii;
#define ff first
#define ss second
const int maxn=105;
int n1,n2,top,cnt;
char s[maxn],stk[maxn];
pii s1[maxn],s2[maxn];
int quick(int a,int b) {
int res=1;
while(b) {
if(b&1)res=res*a;
a=a*a,b>>=1;
}
return res;
}
int main() {
scanf("%s",s+1);
int len=strlen(s+1);
for(int i=1;i<=len;i++) {
if(s[i]>='0'&&s[i]<='9')s1[++n1]=make_pair(s[i]-'0',1);
if(s[i]=='(')stk[++top]=s[i];
if(s[i]=='+'||s[i]=='-') {
if(i==1||s[i-1]=='(') {
if(s[i]=='+')s1[++n1]=make_pair(s[i+1]-'0',1);
else s1[++n1]=make_pair(-(s[i+1]-'0'),1);
i++;
}
else {
while(top&&stk[top]!='(')
s1[++n1]=make_pair(stk[top],0),top--;
stk[++top]=s[i];cnt++;
}
}
if(s[i]=='*'||s[i]=='/') {
while(top&&stk[top]!='('&&stk[top]!='+'&&stk[top]!='-')
s1[++n1]=make_pair(stk[top],0),top--;
stk[++top]=s[i];cnt++;
}
if(s[i]=='^') {
while(top&&stk[top]!='('&&stk[top]=='^')
s1[++n1]=make_pair(stk[top],0),top--;
stk[++top]=s[i];cnt++;
}
if(s[i]==')') {
while(stk[top]!='(')
s1[++n1]=make_pair(stk[top],0),top--;
top--;
}
}
while(top)s1[++n1]=make_pair(stk[top],0),top--;
pii *a=s1,*b=s2;
while(~cnt) {
for(int i=1;i<=n1;i++)
if(!a[i].ss)printf("%c ",a[i].ff);
else printf("%d ",a[i].ff);
puts("");cnt--;
bool bo=0;n2=0;
for(int i=1;i<=n1;i++) {
if(!bo&&!a[i].ss) {
int num1=b[n2-1].ff,num2=b[n2].ff;
if(a[i].ff=='+')num1+=num2;
if(a[i].ff=='-')num1-=num2;
if(a[i].ff=='*')num1*=num2;
if(a[i].ff=='/')num1/=num2;
if(a[i].ff=='^')num1=quick(num1,num2);
bo=1,n2--;b[n2]=make_pair(num1,1);
}
else b[++n2]=a[i];
}
swap(a,b),swap(n1,n2);
}
return 0;
}
洛谷【P1175】表达式的转换的更多相关文章
- 洛谷P1175 表达式的转换
P1175 表达式的转换 44通过 147提交 题目提供者该用户不存在 标签云端 难度提高+/省选- 时空限制1s / 128MB 提交 讨论 题解 最新讨论更多讨论 这题有毒 抄题解棒责五十! ...
- 中后缀表达式/洛谷P1175 表达式的转换
P1175 表达式的转换 思路:先用栈转成中缀表达式,再用栈进行计算.要输出过程,因此计算一次输出一次,但是栈没有迭代器,不好用,换成vector(可以pop_back).虽然表达式求值也可以这么做, ...
- 洛谷P1017 进制转换
洛谷P1017 进制转换 题目描述 我们可以用这样的方式来表示一个十进制数: 将每个阿拉伯数字乘以一个以该数字所处位置的(值减1)为指数,以10为底数的幂之和的形式.例如:123可表示为 \(1*10 ...
- 洛谷p1017 进制转换(2000noip提高组)
洛谷P1017 进制转换 题意分析 给出一个数n,要求用负R进制显示. n∈[-32768,32767].R ∈[-20,-2] 考察的是负进制数的转换,需要理解短除法. 看到这道题的时候,我是比较蒙 ...
- 洛谷P1310 表达式的值 题解 栈/后缀表达式的应用
题目链接:https://www.luogu.org/problem/P1310 本题涉及算法:栈.前缀表达式转后缀表达式,动态规划思想. 这道题目我思考了好长时间,第一时间让我做的话我也做不出来. ...
- 洛谷 P1017 进制转换
推荐洛谷 题目描述 我们可以用这样的方式来表示一个十进制数: 将每个阿拉伯数字乘以一个以该数字所处位置的(值减1)为指数,以10为底数的幂之和的形式.例如:123可表示为 1*10^2+2*10^1+ ...
- 2019.06.17课件:[洛谷P1310]表达式的值 题解
P1310 表达式的值 题目描述 给你一个带括号的布尔表达式,其中+表示或操作|,*表示与操作&,先算*再算+.但是待操作的数字(布尔值)不输入. 求能使最终整个式子的值为0的方案数. 题外话 ...
- 洛谷P1310 表达式的值——题解
题目传送 题的难点:1.有运算优先级,不好判断.2.有破坏整体和谐性的讨厌的括号.3.不知道哪里要填数.4.要求方案数很大,搜索不会做呐. 发现难点1和2都是中缀表达式的缺点.转成后缀表达式后难点1. ...
- 洛谷P2084 进制转换
题目背景 无 题目描述 今天小明学会了进制转换,比如(10101)2 ,那么它的十进制表示的式子就是 : 1*2^4+0*2^3+1*2^2+0*2^1+1*2^0, 那么请你编程实现,将一个M进制的 ...
- 洛谷 P1739 表达式括号匹配
题目链接https://www.luogu.org/problemnew/show/P1739 题目描述 假设一个表达式有英文字母(小写).运算符(+,—,*,/)和左右小(圆)括号构成,以“@”作为 ...
随机推荐
- Java防止XSS攻击
方法一:转义存储:添加XssFilter 1.在web.xml添加过滤器: <!-- 解决xss漏洞 --> <filter> <filter-name>xssFi ...
- nginx学习之压缩解压篇(七)
1.简介 压缩响应可以减少传输数据的大小,节省带宽.但过多的压缩会造成很大的处理开销.在发送给客户端之前,nginx会对响应做压缩,但是如果后端服务器已经 压缩过了,nginx就不再压缩. 2.开启压 ...
- 加密php源代码
<?php function RandAbc($length = "") { //返回随机字符串 $str = "ABCDEFGHIJKLMNOPQRSTUVWXY ...
- PostgreSQL 里面的 BIGSERIAL
@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id; CREATE TABLE article( id BIGS ...
- mysql用户和权限管理(Linux系统下)
在mysql自带的库中有一个mysql,这个库包含了太多的东西,其中有一张表user,这张表存储了所有的用户信息. mysql> select user,host,password from u ...
- 波浪分析数据转换:大智慧、钱龙、胜龙可用Advanced GET ToGet 数据转换器V3.05特别版
http://www.55188.com/thread-4185427-1-1.html Advanced GET ToGet 数据转换器V3.05特别版,大智慧可用软件数据类型选“分析家”源软件数据 ...
- 改善程序与设计的55个具体做法 day9
条款23:宁以non-member.non-friend替换member函数 即 以非成员函数 非友元函数 替换成员函数. 直观上,面向对象应该尽可能的封装,封装数据.封装操作等等,所以这个条款可能有 ...
- 每天一个Linux命令(12)more命令
more命令是一个基于vi编辑器文本过滤器,它以全屏幕的方式按页显示文本文件的内容,支持vi中的关键字定位操作. 该命令一次显示一屏文本,满屏后停下来,并且在屏幕的底部出现一个提示信息,给出至今己显示 ...
- c的详细学习(4)选择结构与循环结构的编程练习
本节介绍c语言的编程实例. (1)求方程ax^2+bx+0的解: 方程有解有以下几种可能: 1.b^2-4ac=0,方程有两个相等实根. 2.b^2-4ac>0,方程有两个不等实 ...
- c的详细学习(11)文件
为了提高数据输入/输出的处理效率,可以将程序运行时所需要的原始数据从文件中读取,并将程序运行的结果写入到文件中. (1)文件概述 1)基本概念 文件是指存储在外部介质上数据的集合,可以 ...