洛谷【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 题目描述 假设一个表达式有英文字母(小写).运算符(+,—,*,/)和左右小(圆)括号构成,以“@”作为 ...
随机推荐
- Sumdiv(较难数学题)
Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 20971 Accepted: 5290 Description Cons ...
- Asp.Net MVC3中如何进行单元测试?
下面我们就以一个示例演示一下如何进行单元测试? public Model.UserInfo UpdateEntity(Model.UserInfo entity) { db.UserInfo.Atta ...
- nodejs windows下安装运行
node 官网下载地址http://nodejs.org/ 下载自己对应的版本 ,我下的是windows版本 node-v4.1.1-x64.msi 然后 下一步 下一步 就完成安装了,非常简单, ...
- [note]CRT&exCRT
中国剩余定理 别人的blog 假设现在有关于x的同余方程组(p1,p2均为质数) \(x=a_1\pmod {p_1}\) \(x=a_2\pmod {p_2}\) 可以转化成如下形式 \(x=a_1 ...
- CMDB的四种模式
为什么要有CMDB? CMDB --Configuration Management Database 配置管理数据库. 1.为了实现资产的自动采集,资产的自动更新, 为了搭建公司自动化平台的基础则需 ...
- Linux c编程:I/O多路复用之select
一般我们在写socet程序的时候调用的accept,recv等操作都是阻塞型的.意思就是如果我们一直收不到数据那么则会被阻塞.所谓阻塞方式block,顾名思义,就是进程或是线程执行到这些函数时必须等待 ...
- C#快速入门笔记(1)——基础语法
C#快速入门笔记(1)——基础语法 总体框架:
- Java实现将一段汉字变成unicode码
public class T { public static void main(String[] args) { String s = "java 中文编码"; System.o ...
- Python 3 mysql 表操作
Python 3 mysql 表操作 表相当于文件,表中的一条记录就相当于文件的一行内容,不同的是,表中的一条记录有对应的标题,称为表的字段 id,name,qq,age称为字段,其余的,一行内容称为 ...
- Java -- Swing 组件使用
1. 示例1 public class Main { JFrame f = new JFrame(); Icon okIcon = new ImageIcon("/home/test/sta ...