题目链接: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)的更多相关文章

  1. PTA-7-20 表达式转换(中缀转后缀,带括号,负数,小数转换)

    本题考点:中缀表达式转后缀表达式. 难点: 带有小数的数字 数字可能带有正负号 题目描述: 算术表达式有前缀表示法.中缀表示法和后缀表示法等形式.日常使用的算术表达式是采用中缀表示法,即二元运算符位于 ...

  2. 河南省acm第九届省赛--《表达式求值》--栈和后缀表达式的变形--手速题

    表达式求值 时间限制:1000 ms | 内存限制:65535 KB 难度:3   描述 假设表达式定义为:1. 一个十进制的正整数 X 是一个表达式.2. 如果 X 和 Y 是 表达式,则 X+Y, ...

  3. 栈的应用1——超级计算器(中缀与后缀表达式)C语言

    这里要学的程序主要用来实现一个功能——输入表达式输出结果,也就是一个计算器.效果如下: 这个程序主要有两个步骤:1.把中缀表达式转换为后缀表达式:2.计算后缀表达式的结果. 首先先明白几个问题: 1. ...

  4. Java数据结构和算法(六)——前缀、中缀、后缀表达式

    前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...

  5. Java数据结构和算法(六):前缀、中缀、后缀表达式

    前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...

  6. C++做四则运算的MFC计算器(二)栈转换和计算后缀表达式

    上篇写了MFC界面搭建,这篇就写实现计算.涉及到数据结构,对新手很不友好. 虽然是MFC程序,但是能灵活地分离后台代码,自行构建控制台程序. 上篇文章链接:C++做四则运算的MFC计算器(一)MFC界 ...

  7. 数据结构之栈—强大的四则复杂运算计算器(超过windows自带的科学计算器)【中缀转后缀表达式】

    比windows自带计算器还强的四则复杂运算计算器! 实测随机打出两组复杂算式:-7.5 * 6 / ( -2 + ( -6.5 -  -5.22 ) )与7.5+-3*8/(7+2) windows ...

  8. sicily 中缀表达式转后缀表达式

    题目描述 将中缀表达式(infix expression)转换为后缀表达式(postfix expression).假设中缀表达式中的操作数均以单个英文字母表示,且其中只包含左括号'(',右括号‘)’ ...

  9. 6, java数据结构和算法: 栈的应用, 逆波兰计算器, 中缀表达式--> 后缀表达式

    直接上代码: public class PolandCalculator { //栈的应用:波兰计算器: 即: 输入一个字符串,来计算结果, 比如 1+((2+3)×4)-5 结果为16 public ...

  10. 数据结构Java实现06----中缀表达式转换为后缀表达式

    本文主要内容: 表达式的三种形式 中缀表达式与后缀表达式转换算法 一.表达式的三种形式: 中缀表达式:运算符放在两个运算对象中间,如:(2+1)*3.我们从小做数学题时,一直使用的就是中缀表达式. 后 ...

随机推荐

  1. mount umont

    如果想在运行的Linux下访问其它文件系统中的资源的话,就要用mount命令来实现. 2.      mount的基本用法是?格式:mount [-参数] [设备名称] [挂载点] 其中常用的参数有: ...

  2. Maven:Maven 入门

    背景 几乎所有的主流平台都提供了依赖管理工具,如:.Net 的 Nuget.Ruby 的 Gem.Node 的 Npm等,今天简单的解释一下如何使用 Maven,以及最常见的问题. 下载 Maven ...

  3. docker和虚拟化技术的区别

    1.docker和虚拟化技术的区别 Docker 扩展了 Linux 容器(Linux Containers),或着说 LXC,通过一个高层次的 API 为进程单独提供了一个轻量级的虚拟环境.Dock ...

  4. sqlmap的篡改绕过WAF

    space2comment.py Replaces space character (‘ ‘) with comments ‘/**/’ Example: * Input: SELECT id FRO ...

  5. CUDA使用Event进行程序计时

    GPGPU是众核设备,包含大量的计算单元,实现超高速的并行. 使用CUDA在nvidia显卡上面编程时,可以使用CUDA提供的Event进行程序计时. 当然,每种编程语言基本都提供了获取系统时间的函数 ...

  6. 如何高效的将excel导入sqlserver?

    大部分人都知道用oledb来读取数据到dataset,但是读取之后怎么处理dataset就千奇百怪了.很多人通过循环来拼接sql,这样做不但容易出错而且效率低下,System.Data.SqlClie ...

  7. jquery选择div下的ul下的li下的a

    使用jQuery选择器: $("div#div的id ul li a")//选择的是div下 ul下所有li下的所有a标签 $("div#div的id").ch ...

  8. 解决Vue用Nginx做web服务器报错favicon.ico 404 (Not Found)的问题

    有多种解决方案 1.vue静态资源 vue中为网页增加favicon的最便捷的方式为使用link标签 <link rel="shortcut icon" type=" ...

  9. C# DataGridView在单元格提示里(ToolTip)显示完整的单元格内容

    当单元格内容太多时,则会忽略后面的内容 解决方案: 添加Dgv鼠标移到单元格事件时,设置当前单元格的ToolTipText属性内容为当前单元格内容 void From_Load(object send ...

  10. CentOS系统时间同步(NTP)

    CentOS系统时间同步的步骤如下: 新装的CentOS系统服务器可能设置了错误的,需要调整时区并调整时间. 如下是CentOS系统使用NTP来从一个时间服务器同步把当前时区调整为上海就是+8区,想改 ...