洛谷P1175 表达式的转换
P1175 表达式的转换
- 44通过
- 147提交
- 题目提供者该用户不存在
- 标签云端
- 难度提高+/省选-
- 时空限制1s / 128MB
提交 讨论 题解
最新讨论更多讨论
- 这题有毒
- 抄题解棒责五十!
- 题面上的“—”是个什么鬼。…
- 关于题意的小疑问
题目描述
平常我们书写的表达式称为中缀表达式,因为它将运算符放在两个操作数中间,许多情况下为了确定运算顺序,括号是不可少的,而中缀表达式就不必用括号了。
后缀标记法:书写表达式时采用运算紧跟在两个操作数之后,从而实现了无括号处理和优先级处理,使计算机的处理规则简化为:从左到右顺序完成计算,并用结果取而代之。
例如:8–(3+2*6)/5+4可以写为:8 3 2 6*+5/–4+
其计算步骤为:8 3 2 6 * + 5 / – 4 +
8 3 12 + 5 / – 4 +
8 15 5 / – 4 +
8 3 – 4 +
5 4 + 9
编写一个程序,完成这个转换,要求输出的每一个数据间都留一个空格。
输入输出格式
输入格式:
就一行,是一个中缀表达式。输入的符号中只有这些基本符号“0123456789+-*/^()”,并且不会出现形如2*-3的格式。
表达式中的基本数字也都是一位的,不会出现形如12形式的数字。
所输入的字符串不要判错。
输出格式:
若干个后缀表达式,第I+1行比第I行少一个运算符和一个操作数,最后一行只有一个数字,表示运算结果。
输入输出样例
8–(3+2*6)/5+4
8 3 2 6 * + 5 / – 4 +
8 3 12 + 5 / – 4 +
8 15 5 / – 4 +
8 3 – 4 +
5 4 +
9
说明
运算的结果可能为负数,“/”以整除运算。并且中间每一步都不会超过2^31。
分析:中缀表达式转换为后缀表达式的一个解法:
0.定义一个栈.
1.遇到数,输出.
2.碰到左括号,直接压到栈顶.
3.碰到一个运算符,如果栈顶元素是左括号,直接压入栈顶,否则,从栈顶开始,把比这个运算符优先级大的给输出,然后压进去.
4.碰到右括号,将元素不断弹出直到遇到左括号.
那么如何进行计算呢?可以发现运算符是按照运算先后顺序出现的,我们只需要将字符串转化为数字,然后枚举到运算符直接运算及可.
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <stack> using namespace std; string s,s1;
int sizee,top,num[]; stack <char> k; void add(char ss)
{
s1 += ss;
s1 += ' ';
} bool check(char t)
{
if (k.empty() || k.top() == '(') //千万不要打反了,血的教训
return true;
if (k.top() == '^')
return false;
if (t == '^')
return true;
if (k.top() == '*' || k.top() == '/')
return false;
if (t == '*' || t == '/')
return true;
return false;
} void jisuan(char x)
{
int a = num[top--], b = num[top--],t = ;
if (x == '+')
t = a + b;
if (x == '-')
t = b - a;
if (x == '*')
t = a * b;
if (x == '/')
t = b / a;
if (x == '^')
t = pow(b, a);
num[++top] = t;
} void solve()
{
for (int i = ; i < sizee; i++)
{
if (s[i] >= '' && s[i] <= '')
add(s[i]);
else
{
if (s[i] == '(')
k.push(s[i]);
else
{
if (s[i] == ')')
{
while (k.top() != '(')
{
add(k.top());
k.pop();
}
k.pop();
}
else
{
if (!check(s[i]))
{
while (!check(s[i]))
{
add(k.top());
k.pop();
}
}
k.push(s[i]);
}
}
}
}
while (!k.empty())
{
add(k.top());
k.pop();
}
cout << s1 << endl;
} void print()
{
for (int i = ; i < s1.size(); i++)
{
if (s1[i] >= '' && s1[i] <= '')
num[++top] = s1[i] - '';
else
{
if (s1[i] == ' ')
continue;
jisuan(s1[i]);
i++;
for (int j = ; j <= top; j++)
printf("%d ", num[j]);
for (int j = i + ; j < s1.size(); j++)
printf("%c", s1[j]);
cout << endl;
}
}
} int main()
{
cin >> s;
sizee = s.size();
solve();
print(); return ;
}
洛谷P1175 表达式的转换的更多相关文章
- 中后缀表达式/洛谷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 题目描述 假设一个表达式有英文字母(小写).运算符(+,—,*,/)和左右小(圆)括号构成,以“@”作为 ...
随机推荐
- C# StreamReader对象
1.读取文件 输入流用于从外部源读取数据,在很多情况下,数据源可以是磁盘上的文件或网络的某些位置,任何可能发送数据的位置都可以是数据源,比如网络应用程序,web服务,甚至是控制台.StreamRead ...
- SummerVocation_Learning--StringBuffer类
java.lang.StringBuffer代表可变的字符序列.与String类基本类似. 常见的构造方法: StringBuffer(),创建一个不包含字符序列的空的StringBuffer对象. ...
- .NET中变量生存期
Web窗体后台 cs 文件中,创建类作用域的变量,在关闭页面的时候并不会消失,当 IIS 站点被关闭的时候,才会调用这个变量的析构函数 但是好像也不肯定在关闭站点才会析构,应该是外层对象析构的时候才会 ...
- GNU C中__attribute__
__attribute__基本介绍: 1. __attribute__ 可以设置函数属性.变量属性和类型属性. 2. __attribute__ 语法格式为:__attribute__ ((attri ...
- 线段树和zkw线段树
作者作为一个蒟蒻,也是最近才自学了线段树,不对的地方欢迎大佬们评论,但是不要喷谢谢 好啦,我们就开始说说线段树吧 线段树是个支持区间操作和查询的东东,平时的话还是蛮实用的 下面以最基本的区间加以及查询 ...
- Fakeapp 入门教程(2):使用篇!
Fakeapp软件的使用主要分成了三个步骤, 使用之前请确保你的电脑配置还可以,推荐配置是:一张显存大于4G的N卡.Fakeapp是有支持CPU选项,但是用CPU跑非常慢. 获取脸部图片 训练模型 生 ...
- DeepFaceLab报错,CUDA driver is insufficient 解决方法!
DeepFaceLab出错,虽然错误提示很长很长,但是无非两种情况,一种是驱动没装好,一种是显存配置不够. CUDA driver version is insufficient for CUDA r ...
- Oracle两种临时表的创建与使用详解
ORACLE数据库除了可以保存永久表外,还可以建立临时表temporary tables.这些临时表用来保存一个会话SESSION的数据,或者保存在一个事务中需要的数据.当会话退出或者用户提交comm ...
- f触发器、存储过程
drop trigger trig_insert--删除触发器
- Git-Git基本操作
先来合个影 马上就要和之前实践遗留的数据告别了,告别之前是不是要留个影呢?在Git里,"留影"用的命令叫做tag,更加专业的术语叫做"里程碑"(打tag,或打标 ...