浅谈栈: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】表达式的转换的更多相关文章

  1. 洛谷P1175 表达式的转换

    P1175 表达式的转换 44通过 147提交 题目提供者该用户不存在 标签云端 难度提高+/省选- 时空限制1s / 128MB 提交  讨论  题解 最新讨论更多讨论 这题有毒 抄题解棒责五十! ...

  2. 中后缀表达式/洛谷P1175 表达式的转换

    P1175 表达式的转换 思路:先用栈转成中缀表达式,再用栈进行计算.要输出过程,因此计算一次输出一次,但是栈没有迭代器,不好用,换成vector(可以pop_back).虽然表达式求值也可以这么做, ...

  3. 洛谷P1017 进制转换

    洛谷P1017 进制转换 题目描述 我们可以用这样的方式来表示一个十进制数: 将每个阿拉伯数字乘以一个以该数字所处位置的(值减1)为指数,以10为底数的幂之和的形式.例如:123可表示为 \(1*10 ...

  4. 洛谷p1017 进制转换(2000noip提高组)

    洛谷P1017 进制转换 题意分析 给出一个数n,要求用负R进制显示. n∈[-32768,32767].R ∈[-20,-2] 考察的是负进制数的转换,需要理解短除法. 看到这道题的时候,我是比较蒙 ...

  5. 洛谷P1310 表达式的值 题解 栈/后缀表达式的应用

    题目链接:https://www.luogu.org/problem/P1310 本题涉及算法:栈.前缀表达式转后缀表达式,动态规划思想. 这道题目我思考了好长时间,第一时间让我做的话我也做不出来. ...

  6. 洛谷 P1017 进制转换

    推荐洛谷 题目描述 我们可以用这样的方式来表示一个十进制数: 将每个阿拉伯数字乘以一个以该数字所处位置的(值减1)为指数,以10为底数的幂之和的形式.例如:123可表示为 1*10^2+2*10^1+ ...

  7. 2019.06.17课件:[洛谷P1310]表达式的值 题解

    P1310 表达式的值 题目描述 给你一个带括号的布尔表达式,其中+表示或操作|,*表示与操作&,先算*再算+.但是待操作的数字(布尔值)不输入. 求能使最终整个式子的值为0的方案数. 题外话 ...

  8. 洛谷P1310 表达式的值——题解

    题目传送 题的难点:1.有运算优先级,不好判断.2.有破坏整体和谐性的讨厌的括号.3.不知道哪里要填数.4.要求方案数很大,搜索不会做呐. 发现难点1和2都是中缀表达式的缺点.转成后缀表达式后难点1. ...

  9. 洛谷P2084 进制转换

    题目背景 无 题目描述 今天小明学会了进制转换,比如(10101)2 ,那么它的十进制表示的式子就是 : 1*2^4+0*2^3+1*2^2+0*2^1+1*2^0, 那么请你编程实现,将一个M进制的 ...

  10. 洛谷 P1739 表达式括号匹配

    题目链接https://www.luogu.org/problemnew/show/P1739 题目描述 假设一个表达式有英文字母(小写).运算符(+,—,*,/)和左右小(圆)括号构成,以“@”作为 ...

随机推荐

  1. output value . Sigmoid neurons are similar to perceptrons, but modified so that small changes in their weights and bias cause only a small change in their output.

    http://neuralnetworksanddeeplearning.com/chap1.html . Sigmoid neurons are similar to perceptrons, bu ...

  2. Python菜鸟之路:Python基础-线程池注释

    import sys import threading import Queue import traceback # 定义一些Exception,用于自定义异常处理 class NoResultsP ...

  3. Android笔记之使用Glide加载网络图片、下载图片

    Glide简介 不想说太多,真的很方便:P)可以节省我不少时间 GitHub地址:https://github.com/bumptech/glide 加载网络图片到ImageView Glide.wi ...

  4. Eclipse +Tomcat配置-【菜鸟学JAVA】

    说起来也惭愧,以前用(Unieap)工具搞了一年多的JAVA+Oracle,现在居然在Eclipse中配置tomcat都搞了半天时间,原来一直是做.NET的. 今天开始不再用集成的环境,话不多说,开始 ...

  5. activiti踩坑

    最近在学习activiti,偶然间遇到一个错误:加载引擎的时候报错,显示空指针错误,跟代码发现初始化配置文件返回为null.几经排查,可能是因为我发布流程后又清空了数据库数据导致的.然后我把表全部删除 ...

  6. (转)关于Http协议,一片就够了

    HTTP简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送 ...

  7. 磁盘检测SMART工具

    题记: 做过一些关于硬盘的调研任务,当时搜集很多资料,不过现在没有,从网上找了一篇关于SMART的介绍,感觉基本上都是比较全面了. 首先各大硬盘厂商生产的硬盘基本都是会遵循SMART的技术标准的,当然 ...

  8. 阿里云修改centos7主机名

    为了玩Docker,买个阿里云主机也是够拼的了. [root@iZ284olvkmjZ ~]# 不过主机名中怎么好DT,无奈,修改. 我们需要的是永久生效,阿里云提供了两种方法: 方法(1). 输入h ...

  9. python3 str和bytes转换

    bytes object b = b"example" str object s = "example" #str to bytes bytes(s, enco ...

  10. php自定义的格式化时间示例代码

    时间刚好是5分钟前,则对应的时间戳就会被格式化为5分钟前,自定义的格式化时间方法如下,感兴趣的朋友可以参考下 如:时间刚好是5分钟前,则对应的时间戳就会被格式化为5分钟前,不多说了,直接贴上代码: 复 ...