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行少一个运算符和一个操作数,最后一行只有一个数字,表示运算结果。

输入输出样例

输入样例#1:

8–(3+2*6)/5+4
输出样例#1:

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

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

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

  2. 洛谷P1017 进制转换

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

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

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

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

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

  5. 洛谷 P1017 进制转换

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

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

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

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

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

  8. 洛谷P2084 进制转换

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

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

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

随机推荐

  1. javaweb基础(25)_jsp标签实例一

    一.简单标签(SimpleTag) 由于传统标签使用三个标签接口来完成不同的功能,显得过于繁琐,不利于标签技术的推广, SUN公司为降低标签技术的学习难度,在JSP 2.0中定义了一个更为简单.便于编 ...

  2. React Native 初探

    推荐文章 React Native 简介:用 JavaScript 搭建 iOS 应用 (1) React Native 简介:用 JavaScript 搭建 iOS 应用 (2) React Nat ...

  3. 32-1题:不分行从上到下打印二叉树/BFS/deque/queue

    题目 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 考点 1.广度优先遍历 2.binary tree 3.queue 4.deque 思路 按层打印:8.6.10.5.7.9.11 用ST ...

  4. Java 解决IE浏览器下载文件,文件名出现乱码问题

    /** * 区分ie 和其他浏览器的下载文件乱码问题 * @param request * @param fileName * @return */ public String getFileName ...

  5. 对比传统方式访问数据库和SpringData访问数据库

    我们在写代码的时候应该一边写一边测试,这样的话可以尽快的找到错误,在代码写多了之后去找错误的话不容易给错误定位 传统方式访问数据库 1:创建一个Maven web项目 2:修改pom.xml为以下内容 ...

  6. python基础 字典排序

    stus = [ {"name":"zhang","age":18}, {"name":"lisi" ...

  7. vs对某些网络错误的拦截

    在编写代码的过程中发现如果在写好网页中的文本框内写入js代码(以<script>1</script>输入为例) vs会自动拦截并报错,如图(密码中我也输入了<script ...

  8. 1.在Cisco Packet Tracer里交换机的初始配置

    基本拓扑图: 点进交换机,会先进入交换机的用户模式,这个模式下交换机的名称后方会以‘>’显示 输入enable会进入交换机的特权模式,同样在交换机的名称后方以‘#’显示 在特权模式的环境下输入c ...

  9. ZendFramework-2.4 源代码 - 路由(类图)

    <?php return array( // console 模式 'console'=>array( 'router' => array( //.... ), ), // http ...

  10. vmware 开机自动启动

    vmware开机自动启动, 可以使用vmrun命令. 1. 首先在“我的电脑”-“属性”-“高级”-“环境变量”-“PATH”中添加vmware路径,如:C:\Program Files (x86)\ ...