Nyoj467【中缀转后缀】
2014-11-05 15:58
218 查看
/*中缀式变后缀式 时间限制: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> char out[1010], stack[1010], s[1010]; int l1, l2; int main() { int i, j, k, m, n; scanf("%d", &n); getchar(); while(n--) { gets(s); m = strlen(s); l1 = k = l2 = 0; for(i = 0; i < m-1; i++) { if(s[i] >= 48 && s[i] <= 57 || s[i] == '.') { if(k) { out[l2++] = ' '; k = 0; } out[l2++] = s[i]; } else if(s[i] == '-' || s[i] == '+') { for(j = l1-1;j >= 0; j--) { if(stack[j] != '(') {out[l2++] = ' '; out[l2++] = stack[j]; l1--; } else { break; } } stack[l1++] = s[i]; k =1; } else if(s[i] == '*' || s[i] == '/') { for(j = l1-1; j >= 0; j--) { if(stack[j] == '*' || stack[j] == '/') { out[l2++] = ' '; out[l2++] = stack[j]; l1--; } else break; } stack[l1++] = s[i]; k = 1; } else if(s[i] == '(') { stack[l1++] = s[i]; k = 1; } else if(s[i] == ')') { for(j = l1-1; j >= 0; j--) { if(stack[j] != '(') { out[l2++] = ' '; out[l2++] = stack[j]; l1--; } else { l1--; break; } } } } while(l1) {out[l2++] = ' '; out[l2++] = stack[l1-1]; l1--; } out[l2] = '\0'; for(i = 0; i < l2 ; i++) { if(out[i] != ' ') { for(j = i; j < l2; j++) { printf("%c", out[j]); } printf(" =\n"); break; } } } return 0; }
这里不好处理的就是输出时的空格
相关文章推荐
- 中缀表达式变后缀表达式 nyoj467
- nyoj-257-中缀转后缀
- NYOJ257郁闷的C小加(一)_中缀转后缀
- nyoj 467 中缀事变后缀式
- 中缀变后缀(nyoj)
- NYOJ 35 表达式求值 【中缀转后缀+后缀表达式求值】
- NYOJ 257 郁闷的C小加(一) (栈 、中缀转后缀)
- 找出以abc为前缀、中缀、后缀的词
- 中缀式转后缀表达式 -NYOJ 题目267郁闷的C小加(二)
- java数据结构与算法之中缀表达式转为后缀表达式的方法
- 中缀到后缀表达式的转换:java-stack实现
- 中缀表达式转后缀表达式
- 中缀变后缀
- 中缀,前缀,后缀表达式
- 前缀 中缀 后缀 波兰式 逆波兰式
- 中缀表达式转后缀表达式(逆波兰式)的C++代码
- 前缀、中缀、后缀表达式与二叉树的前序、中序、后序遍历
- 中缀转后缀
- 中缀转后缀表达式
- 中缀表达式 转换为 后缀表达式