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.我们从小做数学题时,一直使用的就是中缀表达式. 后 ...
随机推荐
- Eclipse启动项目时,删除workspaces无用的工作区间
选择菜单栏的window-->Preferences-->General-->Startup and Shutdown-->workspaces, Recent workspa ...
- PIR人体检查
1.无变化时电压为0.8V左右 2.当检查到人体活动,电压保持为-1.3V,直到运动停止. 下面是示波器的截图
- sharememory.c
//进程通信,共享存储区 #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #i ...
- 1644 免费馅饼 题解(c++)
1644 免费馅饼(巴蜀oj上的编号) 题面: SERKOI最新推出了一种叫做"免费馅饼"的游戏. 游戏在一个舞台上进行.舞台的宽度为W格,天幕的 ...
- apache kafka监控系列-KafkaOffsetMonitor(转)
原文链接:apache kafka监控系列-KafkaOffsetMonitor 概览 最 近kafka server消息服务上线了,基于jmx指标参数也写到zabbix中了,但总觉得缺少点什么东西, ...
- vmwareubuntu18.04网络配置
用vm安装ubuntu的时候要如果使用的是net模式,要确保vm的net服务和dhcp服务开启了,右键我的电脑-管理-服务和应用程序-服务找到对应的vm net服务和dhcp服务启动.
- 服务 进程守护 MarsDaemon 简介
MarsDaemon 基本功能 https://github.com/Marswin/MarsDaemon It is a lite library, you can make your projec ...
- MySQL服务器安装完之后如何调节性能
原文作者: Peter Zaitsev原文来源: http://www.mysqlperformanceblog.com/2006/09/29/what-to-tune-in-mysql-server ...
- System.Windows.Forms
File: winforms\Managed\System\WinForms\DataGridView.cs Project: ndp\fx\src\System.Windows.Forms.cspr ...
- struts2学习笔记(三)—— 在用户注冊程序中使用验证框架
实现目标: 1.使用验证框架对用户注冊信息进行验证 2.验证username.password.邮箱不能为空 3.验证username.password长度 ...