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.我们从小做数学题时,一直使用的就是中缀表达式. 后 ...
随机推荐
- HSSFWorkbook 创建Excel文件
1.项目代码实例 @Override public OutputStream exportAucLotData(String id, String password, OutputStream out ...
- Django文档学习
文档位置:https://docs.djangoproject.com/zh-hans/2.1/
- SpEL笔记
SpEL使用示例 <bean id="chineseA" class="com.xxx.bean.Chinese" scope="prototy ...
- Centos 7 配置 VNCServer 經驗
安裝 Centos 7後, 習慣性的安裝 Xmanager 3或4, 都不能正常工作, 無奈之下開始安裝 VNCServer. (個人習慣使用Xmanager, 因為不需要安裝,只要配置一下就能用, ...
- IP addr命令
我们都知道Windows上查看IP地址是ipconfig, Linux上是ifconfig,但是Linux上还有一个命令叫ip addr可以查看IP地址. 如上图所示命令显示了机器上的所有网卡,大部分 ...
- ECharts学习总结(一):ECharts的第一个图表
在进行echarts图表开发之前先要到echarts官网下载echarts的库文件,我下载的是echarts-2.2.7.然后把库文件放到工程文件web目录下.接下来进行第一个图表的显示步骤如下: 1 ...
- java设计模式6--适配器模式(Adapter )
本文地址:http://www.cnblogs.com/archimedes/p/java-adapter-pattern.html,转载请注明源地址. 适配器模式(别名:包装器) 将一个类的接口转换 ...
- Atlassian官方合作伙伴
Atlassian官方合作伙伴 http://atlassian.csdn.net/m/btc/atlassian/index
- 转:如何转换Android打包用jks格式keystore证书为Air用pkcs12格式p12证书
转自:http://blog.k-res.net/archives/1539.html 如何转换Android打包用jks格式keystore证书为Air用pkcs12格式p12证书 六月 11, 2 ...
- 关于CPU的运行队列与系统负载
在linux操作系统中,我们一般查看系统的cpu负载情况常用的命令可以是uptime,top,还有vmstat等这些个都是可以有的.每个工具所提供的信息各不相同, 我这里要讨论的仅说cpu部分.使用u ...