浅谈栈: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. Arrays数组工具类中存在的坑!

    以下是一个坑: 看到使用asList时候,可以返回一个集合,当然集合拥有CRUD的特性: 代码中使用 了add和remove时候均报错:Exception in thread "main&q ...

  2. 洛谷2704 [NOI2001]炮兵阵地

    题目戳这里 Solution 状压DP很好的入门题,用熟练位运算貌似也没那么难. 首先分析一下题目: 看见n=100,m=10,立马就想到了状压,看起来也像DP,所以我们还是采用行号为阶段的状压DP. ...

  3. Django 事务

    Django事务 事务是通过将一组相关操作组合为一个,要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠.事务具有4个特性:原子性.一致性.隔离性.持久性. 默认情况下,在Djang ...

  4. vue 计算属性和监听器

    一.计算属性 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑会让模板过重且难以维护.例如: <div> {{ message.split('').rev ...

  5. linux 中sort命令 按照指定列排序

    sort怎样按指定的列排序0000 27189 41925425065f 15 419254250663 7 419254250675 5 419254250691 76 419254250693 2 ...

  6. 如何在官网下载java JDK的历史版本

    如何在官网下载java JDK的历史版本 http://jingyan.baidu.com/article/9989c746064d46f648ecfe9a.html 如何在官网下载java JDK的 ...

  7. 正则表达式备忘(基于JavaScript)

    基于JS学习的正则表达式 备忘 e.g.匹配以0开头的三位或四位区号,以-分格的7或8位电话号码var reg1 = /^0\d{2,3}\-\d{7,8}$/;或var reg1 = new Reg ...

  8. LeetCode:字符串的排列【567】

    LeetCode:字符串的排列[567] 题目描述 给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列. 换句话说,第一个字符串的排列之一是第二个字符串的子串. 示例1: ...

  9. jquery链式语法

    <!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...

  10. js之语句的一些需要注意的事情

    1.delete运算符是用来删除一个对象的 属性,但有一点需要注意:使用var声明的变量虽为全局变量,单不是全局对象的属性,不可以用delete删除,而不用var直接声明的全局变量而直接赋值的为全局对 ...