中缀式变后缀式
2016-03-04 13:34
507 查看
中缀式变后缀式
时间限制:1000 ms | 内存限制:65535 KB难度:3
描述人们的日常习惯是把算术表达式写成中缀式,但对于机器来说更“习惯于”后缀式,关于算术表达式的中缀式和后缀式的论述一般的数据结构书都有相关内容可供参看,这里不再赘述,现在你的任务是将中缀式变为后缀式。
输入第一行输入一个整数n,共有n组测试数据(n<10)。 每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式的中缀式,每个运算式都是以“=”结束。这个表达式里只包含+-*/与小括号这几种符号。其中小括号可以嵌套使用。数据保证输入的操作数中不会出现负数。 数据保证除数不会为0输出每组都输出该组中缀式相应的后缀式,要求相邻的操作数操作符用空格隔开。样例输入
2 1.000+2/4= ((1+2)*5+1)/4=
样例输出
1.000 2 4 / + = 1 2 + 5 * 1 + 4 / = 题解:简单模拟下就行了; 代码:
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #include<stack> using namespace std; const int MAXN=1010; char s[MAXN]; void getnum(int& i){ while(isdigit(s[i])||s[i]=='.'){ printf("%c",s[i++]); } } char work(char a,char b){ if(a=='#')return '<'; if(a=='+'||a=='-'){ if(b=='*'||b=='/'||b=='(')return '<'; else return '>'; } if(a=='*'||a=='/'){ if(b=='(')return '<'; else return '>'; } if(a=='('&&b==')')return '='; if(b==')')return '>'; return '<'; } int main(){ int T; scanf("%d",&T); while(T--){ scanf("%s",s); stack<char>S; S.push('#'); for(int i=0;s[i];){ if(isdigit(s[i])||s[i]=='.'){ getnum(i); printf(" "); } else{ switch(work(S.top(),s[i])){ case '<':S.push(s[i]);i++;break; case '>':printf("%c ",S.top());S.pop();break; case '=':S.pop();i++;break; } } } puts("="); } return 0; }
相关文章推荐
- 【SpringMVC】SpringMVC系列11之Restful的CRUD
- redis.conf详细说明
- 练习1-2
- Java集合
- 【矩阵加速】[POJ3233]Matrix Power Series
- 基于Docker快速搭建单机版Kuberntes
- Java实例分析:宠物商店
- input标签的获得焦点和失去焦点的样式
- jmeter+ant压测执行多条参数化
- Python 拆分字符串
- iOS学习----------多线程(NSThread/GCD/NSOperation)
- Android4.4关机菜单添加重启系列选项
- 【SpringMVC】SpringMVC系列10之视图与视图解析器
- JPA配置sqlserver数据源模式下出现:"***" 附近出现语法错误。
- ibatis和spring的整合
- 在mac上用Xcode写程序, run的时候总是失败, 显示clang: error: linker command failed with exit code 1
- div实现拖拽效果,同时包含iframe
- Exchange邮箱弱密码所造成的影响
- 禁止用户在任务管理器中停止服务
- 练习1-1