NYOJ 467 中缀式变后缀式
2015-06-03 13:43
381 查看
做了表达式求值那道题之后做的
时间限制:1000 ms | 内存限制:65535 KB
难度:3
描述
人们的日常习惯是把算术表达式写成中缀式,但对于机器来说更“习惯于”后缀式,关于算术表达式的中缀式和后缀式的论述一般的数据结构书都有相关内容可供参看,这里不再赘述,现在你的任务是将中缀式变为后缀式。
输入
第一行输入一个整数n,共有n组测试数据(n<10)。
每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式的中缀式,每个运算式都是以“=”结束。这个表达式里只包含+-*/与小括号这几种符号。其中小括号可以嵌套使用。数据保证输入的操作数中不会出现负数。
数据保证除数不会为0
输出
每组都输出该组中缀式相应的后缀式,要求相邻的操作数操作符用空格隔开。
样例输入
样例输出
时间限制: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 <cstring> #include <string> #include <stack> using namespace std; int prio(char x) { if('+'==x || '-'==x) return 1; else if('*'==x || '/'==x) return 2; return 0; } int main() { int n,i; string s1,s2; stack<char> s; cin>>n; while(n--) { cin>>s1; s2=""; for(i=0,s.push('=');i<s1.length()-1;i++) { if('('==s1[i]) s.push(s1[i]); else if(')'==s1[i]) { while(s.top()!='(') { s2+=s.top(); s2+=' '; s.pop(); } s.pop(); } else if('+'==s1[i] || '-'==s1[i] || '*'==s1[i] || '/'==s1[i]) { while(prio(s.top())>=prio(s1[i])) //!!!这个地方容易把 prio(s1[i]) 写成 s1[i] { s2+=s.top(); s2+=' '; s.pop(); } s.push(s1[i]); } else { while(isdigit(s1[i]) || '.'== s1[i]) s2+=s1[i++]; i--; s2+=' '; } } while(s.top()!= '=') { s2+=s.top(); s2+=' '; s.pop(); } s2+=s.top(); s.pop(); cout<<s2<<endl; } return 0; }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++编写简单的打靶游戏
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- C++中拷贝构造函数的应用详解
- C++中引用(&)的用法与应用实例分析
- C++使用CriticalSection实现线程同步实例
- C++智能指针实例详解
- 解析C++ 浮点数的格式化输出