3-06. 表达式转换(25)(中缀表达式转后缀表达式ZJU_PAT)
题目链接:http://pat.zju.edu.cn/contests/ds/3-06
算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。
日常使用的算术表达式是採用中缀表示法,即二元运算符位于两个运算数中间。
请设计程序将中缀表达式转换为后缀表达式。
输入格式说明:
输入在一行中给出不含空格的中缀表达式,可包括+、-、*、\以及左右括号()。表达式不超过20个字符。
输出格式说明:
在一行中输出转换后的后缀表达式。要求不同对象(运算数、运算符号)之间以空格分隔。但结尾不得有多余空格。
例子输入与输出:
| 序号 | 输入 | 输出 |
| 1 |
2+3*(7-4)+8/4 |
2 3 7 4 - * + 8 4 / + |
| 2 |
((2+3)*4-(8+2))/5 |
2 3 + 4 * 8 2 + - 5 / |
| 3 |
1314+25.5*12 |
1314 25.5 12 * + |
| 4 |
-2*(+3) |
-2 3 * |
| 5 |
123 |
123 |
PS:起初第一天晚上做了好久。一直有个案例是PE。PE到吐也没过掉;
(甚至都有去找陈越姥姥求案例了的想法了)
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjg2MDA2Mw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
终于没有去,第二天晚上又坐在电脑前想了各种案例,改了半天终于过掉了,
可是由于改动的地方太多。所以生成了如今这渣的不忍直视的代码,
此代码仅留作纪念(实在不忍直视)。
代码例如以下:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <stack>
using namespace std;
const int maxn = 520;
stack <char>ss;
char s[maxn]; int isnum(char c)
{
if((c>='0' && c<='9') || c=='.')
return 1;
return 0;
} int val_op(char c)
{
if(c == '(' || c == ')')
return 1;
else if(c == '+' || c == '-')
return 2;
else if(c == '*' || c == '/')
return 3;
return 0;
}
int main()
{
scanf("%s",s);
int len = strlen(s);
int flag = 0, mark = 0;
int k = 0;
for(int i = 0; i < len; i++)
{
if(i == 0)
{
if(s[i] == '(' && (s[i+1]=='+'||s[i+1]=='-'))
{
continue;
}
}
if(i == 0)//为了防止相似:-2*(+3)的案例
{
if(s[i]=='-' || s[i] == '+')
{
k++;
printf("%c",s[0]);
continue;
}
}
//printf("size:%d",ss.size());
if(isnum(s[i]))//遇到运算数直接输出
{
if(!flag)
{
flag = 1;
k++;
while(isnum(s[i]))
{
k++;
printf("%c",s[i]);
i++;
}
i--;//由于前面多加了一次
continue;
//printf("%c",s[i]);
}
else if(mark == 0)//为了防止相似:-2*(+3)的案例
{
k++;
printf("%c",s[i]);
}
else
{
k++;
printf(" %c",s[i]);
mark = 0;
}
continue;
}
mark = 1;//为了防止相似:-2*(+3)的案例
if(s[i-1] == '(' && (s[i]=='+'))
{
if(flag || k!=0)
printf(" ");
while(isnum(s[++i]))
{
k++;
printf("%c",s[i]);
}
i--;//由于前面多加了一次
continue;
}
else if(s[i-1] == '(' && s[i] == '-')
{
if(flag || k!=0)
printf(" -");
else
printf("-");
while(isnum(s[++i]))
{
k++;
printf("%c",s[i]);
}
i--;//由于前面多加了一次
continue;
}
if(s[i] == '(')//遇到左括号压入栈
{
ss.push(s[i]);
}
else if(s[i] == ')')//遇到右括号把栈内的运算符输出知道遇到左括号
{
if(ss.size()==0)
continue;
while(ss.top()!='(')
{
k++;
printf(" %c",ss.top());
ss.pop();
}
// printf(" d%cd ",ss.top());
ss.pop();
}
else if(ss.size())
{
if(val_op(s[i]) <= val_op(ss.top()))//假设遇到的运算符的优先级小于等于栈顶运算符
{
while(ss.size())
{
char tc = ss.top();
if(val_op(tc) < val_op(s[i]))//直到当前运算符的优先级大于栈顶运算符
{
//ss.push(tc);
break;
}
if(tc!='(' && tc != ')')
{
k++;
printf(" %c",tc);
}
ss.pop();
}
}
}
if(s[i]!='(' && s[i]!=')')
ss.push(s[i]);
}
if(ss.size())//输出栈内的运算符
{
int len = ss.size();
for(int i = 0; i < len; i++)
{
if(ss.top()!='(' && ss.top()!=')')
{
k++;
printf(" %c",ss.top());
}
ss.pop();
}
}
printf("\n"); return 0;
} /*
2+3*(7-4)+8/4
//2 3 7 4 - * + 8 4 / + ((2+3)*4-(8+2))/5
//2 3 + 4 * 8 2 + - 5 / 1314+25.5*12
//1314 25.5 12 * + 2*(9+6/3-5)+4
//2 9 6 3 / + 5 - * 4 + -2*(+3)
//-2 3 * 123
//123 1.2+(-5)+(+8)
//1.2 -5 + 8 + -10.25+(-567)+(+563)
//-10.25 -567 + 563 + (-656)
//-656 (-21)-(-4552)
//-21 -4552 - (+21)-(-4564)
//21 -4564 - (21)
//21 */
3-06. 表达式转换(25)(中缀表达式转后缀表达式ZJU_PAT)的更多相关文章
- PTA-7-20 表达式转换(中缀转后缀,带括号,负数,小数转换)
本题考点:中缀表达式转后缀表达式. 难点: 带有小数的数字 数字可能带有正负号 题目描述: 算术表达式有前缀表示法.中缀表示法和后缀表示法等形式.日常使用的算术表达式是采用中缀表示法,即二元运算符位于 ...
- 河南省acm第九届省赛--《表达式求值》--栈和后缀表达式的变形--手速题
表达式求值 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 假设表达式定义为:1. 一个十进制的正整数 X 是一个表达式.2. 如果 X 和 Y 是 表达式,则 X+Y, ...
- 栈的应用1——超级计算器(中缀与后缀表达式)C语言
这里要学的程序主要用来实现一个功能——输入表达式输出结果,也就是一个计算器.效果如下: 这个程序主要有两个步骤:1.把中缀表达式转换为后缀表达式:2.计算后缀表达式的结果. 首先先明白几个问题: 1. ...
- Java数据结构和算法(六)——前缀、中缀、后缀表达式
前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...
- Java数据结构和算法(六):前缀、中缀、后缀表达式
前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...
- C++做四则运算的MFC计算器(二)栈转换和计算后缀表达式
上篇写了MFC界面搭建,这篇就写实现计算.涉及到数据结构,对新手很不友好. 虽然是MFC程序,但是能灵活地分离后台代码,自行构建控制台程序. 上篇文章链接:C++做四则运算的MFC计算器(一)MFC界 ...
- 数据结构之栈—强大的四则复杂运算计算器(超过windows自带的科学计算器)【中缀转后缀表达式】
比windows自带计算器还强的四则复杂运算计算器! 实测随机打出两组复杂算式:-7.5 * 6 / ( -2 + ( -6.5 - -5.22 ) )与7.5+-3*8/(7+2) windows ...
- sicily 中缀表达式转后缀表达式
题目描述 将中缀表达式(infix expression)转换为后缀表达式(postfix expression).假设中缀表达式中的操作数均以单个英文字母表示,且其中只包含左括号'(',右括号‘)’ ...
- 6, java数据结构和算法: 栈的应用, 逆波兰计算器, 中缀表达式--> 后缀表达式
直接上代码: public class PolandCalculator { //栈的应用:波兰计算器: 即: 输入一个字符串,来计算结果, 比如 1+((2+3)×4)-5 结果为16 public ...
- 数据结构Java实现06----中缀表达式转换为后缀表达式
本文主要内容: 表达式的三种形式 中缀表达式与后缀表达式转换算法 一.表达式的三种形式: 中缀表达式:运算符放在两个运算对象中间,如:(2+1)*3.我们从小做数学题时,一直使用的就是中缀表达式. 后 ...
随机推荐
- android 广告平台 keymob
访问地址: http://www.keymob.com/
- Mac配置PHP开发环境
安装环境如下: Mac OS 10.10.1 Apache 2.4.9 PHP 5.5.14 MySQL 5.6.22 Apache配置 在Mac OS 10.10.1中是自带Apache软件的,我们 ...
- 分享一个 markdown 编辑器 - Mditor
只求极致 [ M ] arkdown + E [ ditor ] = Mditor Mditor 是一个简洁.易于集成.方便扩展.期望舒服的编写 markdown 的编辑器,仅此而已... 主页: h ...
- Orchard运用 - 特定主题添加独立代码文件
今天继续跟大家分享捣鼓Orchard的一些心得.其实有时一些问题或者Bugs还是蛮好解决的,主要看你采取哪种方式方法.比如有时我们为了扩展某些特性或功能,你可以搭建一个全新的模块来完成,如果临时的或简 ...
- SQL Server Service Broker 简单例子 (转)
SQL Server Service Broker服务体系结构 消息类型 — 定义应用程序间交换的消息的名称.还可以选择是否验证消息.约定 — 指定给定会话中的消息方向和消息类型.队列 — 存储消息. ...
- Java GC、新生代、老年代
堆内存 Java 中的堆是 JVM 所管理的最大的一块内存空间,主要用于存放各种类的实例对象.在 Java 中,堆被划分成两个不同的区域:新生代 ( Young ).老年代 ( Old ).新生代 ( ...
- 机器学习实战之PCA
1. 向量及其基变换 1.1 向量内积 (1)两个维数同样的向量的内积定义例如以下: 内积运算将两个向量映射为一个实数. (2) 内积的几何意义 如果A\B是两个n维向量, n维向量能够等价表示为n ...
- 外媒关注:中国版Twitter新浪微博推出微米对抗微信
Sina, China’s answer to Twitter, enters the mobile messaging battle with its own app 中国版Twitter新浪,用自 ...
- es6- ArrayBuffer
ArrayBuffer对象.TypedArray视图和DataView视图是 JavaScript 操作二进制数据的一个接口. 简单说: ArrayBuffer对象代表原始的二进制数据, TypedA ...
- myeclipse报异常:java.lang.OutOfMemoryError: Java heap space