郁闷的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的字符串,表示这个表达式。这个表达式里只包含+-*/与小括号这几种符号。其中小括号可以嵌套使用。数据保证输入的操作数中不会出现负数。并且输入数据不会出现不匹配现象。 输出
- 每组输出都单独成行,输出转换的后缀表达式。 样例输入
-
21+2(1+2)*3+4*5
样例输出 -
12+12+3*45*+
中缀式变后缀式
思路:从左到右扫描表达式,若为操作数,直接输出,若为操作符,则样将当前操作符和操作符栈的栈顶操作符进行优先级比较。
(1).若当前操作符优先级大于操作符栈的栈顶操作符,则将当前操作符压入操作符栈中;
(2)若当前操作符优先级等于操作符栈的栈顶操作符,则将当前操作符栈的栈顶的操作符出栈;
(3)若当前操作符优先级小于操作符栈的栈顶操作符,则将当前操作符栈的栈顶的操作符输出,拿当前操作符重继续执行这三步。
1 /* 2 Name: NYOJ--257--郁闷的C小加(一) 3 Copyright: ©2017 日天大帝 4 Author: 日天大帝 5 Date: 04/05/17 10:11 6 Description: 中缀表达式变后缀表达式 7 */ 8 #include9 #include 10 #include 11 using namespace std;12 char judge(char s,char ch) {13 if(s == '+' || s== '-'){14 if(ch == '*' || ch == '/' || ch == '(')return '<';15 else return '>';16 }17 if(s == '*' || s == '/'){18 if(ch == '(')return '<';19 else return '>';20 }21 if(s == ')')return '>';22 if(s == '(' || s== '#'){23 if(s == '('&& ch == ')' || s == '#' && ch == '#')return '=';24 else return '<';25 }26 }27 int main(){28 ios::sync_with_stdio(false);29 30 int n;cin>>n;31 while(n--){32 string str;cin>>str;33 str += '#';34 stack s;35 s.push('#');36 for(int i=0; i ':{52 char c = s.top();s.pop();53 cout<