中缀式变后缀式
时间限制:
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<stdio.h> #include<string.h> #include<iostream> #include<queue> #include<stack> using namespace std; queue<char> q; //数字队列;此数字也用来存放输出顺序 stack<char> s; //操作符栈 char str[1010]; int oper(char ch){ switch(ch) { case '*': case '/': return 2; case '+': case '-': return 1; default : return -1;//操作符为‘(’时 } }//输出操作符优先级 //以操作符为标准,每遇到一个操作符,都要在队列输入一个空格, //则输出时相邻操作符或操作数之间有空格 int main(){//q是队列 s是操作栈 int t, i; scanf("%d", &t); getchar(); while(t--) { while(!q.empty()) q.pop(); while(!s.empty()) s.pop();//初始化 scanf("%s", str); //getchar(); int len = strlen(str); for(i = 0; i < len-1; i++) { if(str[i] <= '9' && str[i] >= '0'||str[i]=='.') q.push(str[i]); else if(str[i] == '(') s.push(str[i]); else if(s.empty()) { s.push(str[i]); q.push(' '); } else if(str[i] == ')') { while(s.top()!= '(') { q.push(' '); q.push(s.top()); s.pop(); } //q.push(' '); s.pop(); } else { while(!s.empty() && oper(str[i]) <= oper(s.top())) { q.push(' '); q.push(s.top()); //先输出优先级高的操作符 s.pop(); } s.push(str[i]); q.push(' '); } } while(!s.empty()) { //处理剩余操作符 q.push(' '); q.push(s.top()); s.pop(); } while(!q.empty()) { //输出队列 printf("%c", q.front()); q.pop(); } printf(" =\n"); } return 0; }
-
第一行输入一个整数n,共有n组测试数据(n<10)。