郁闷的C小加(一)
时间限制:1000 ms | 内存限制:65535 KB
难度:3
- 描述
-
我们熟悉的表达式如a+b、a+b*(c+d)等都属于中缀表达式。中缀表达式就是(对于双目运算符来说)操作符在两个操作数中间:num1 operand num2。同理,后缀表达式就是操作符在两个操作数之后:num1 num2 operand。ACM队的“C小加”正在郁闷怎样把一个中缀表达式转换为后缀表达式,现在请你设计一个程序,帮助C小加把中缀表达式转换成后缀表达式。为简化问题,操作数均为个位数,操作符只有+-*/ 和小括号。
- 输入
- 第一行输入T,表示有T组测试数据(T<10)。
每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个表达式。这个表达式里只包含+-*/与小括号这几种符号。其中小括号可以嵌套使用。数据保证输入的操作数中不会出现负数。并且输入数据不会出现不匹配现象。
- 输出
- 每组输出都单独成行,输出转换的后缀表达式。
- 样例输入
-
2 1+2 (1+2)*3+4*5
- 样例输出
-
12+ 12+3*45*+
/** 分析:该题是,将中缀表达式转化为后缀表达式 步骤: ①、遇到数字(digit)直接将数字放入队列 ②、遇到小括号 '(' 入栈 ③、遇到小括号 ')' 就将 小括号'('以上的所有运算符出栈《并将其放入队列》、最后将 '(' 出栈 ④、新输入一个运算符的时候判断,如果新出现的运算符的优先级小于等于栈顶优先级 ==> 栈内元素出栈《并将其放入队列》、最后将新出现的运算符入栈 ⑤、 将栈内所有的元素出栈 《并将其放入队列》 **/
C/C++代码实现:
#include <iostream> #include <algorithm> #include <cstdio> #include <cmath> #include <cstring> #include <stack> #include <queue> using namespace std; int priority (char c) { if (c == '*' || c == '/') return 2; if (c == '+' || c == '-') return 1; return 0; } int main () { int T; scanf ("%d", &T); while (T --) { string str; cin >>str; int len = str.size (); stack <char> my_stack_op; queue <char> my_queue; my_stack_op.push ('#'); for (int i = 0; i < len; ++i) { if (str [i] >= '0' &&str [i] <= '9') { my_queue.push (str[i]); } else if (str [i] == '(') { my_stack_op.push ('('); } else if (str [i] == ')') { char c = my_stack_op.top(); while (c != '(') { my_queue.push (c); my_stack_op.pop (); c = my_stack_op.top (); } my_stack_op.pop (); } else { char c = my_stack_op.top (); while (priority (c) >= priority (str [i])) { my_queue.push (c); my_stack_op.pop (); c = my_stack_op.top (); } my_stack_op.push (str [i]); } } while (!my_stack_op.empty ()) { my_queue.push (my_stack_op.top()); my_stack_op.pop (); } while (!my_queue.empty()) { if (my_queue.front () != '#') printf ("%c", my_queue.front()); my_queue.pop(); } printf (" "); } return 0; }