郁闷的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*+
1 /* 功能Function Description: NYOJ-257 中缀式变后缀式 2 开发环境Environment: DEV C++ 4.9.9.1 3 技术特点Technique: 4 版本Version: 5 作者Author: 可笑痴狂 6 日期Date: 20120805 7 备注Notes: 8 */ 9 10 #include<stdio.h> 11 #include<iostream> 12 #include<string.h> 13 #include<stack> 14 using namespace std; 15 char precede(char s,char z)//判断算术符的优先级* 16 { 17 if(s=='+'||s=='-') 18 { 19 if(z=='*'||z=='/'||z=='(') 20 return '<'; 21 else 22 return '>'; 23 } 24 if(s=='*'||s=='/') 25 { 26 if(z=='(') 27 return '<'; 28 else 29 return '>'; 30 } 31 /* 32 if(s=='('||s=='#') //对于‘#’可以不用判断,因为下边会在栈顶出现‘#’而且当前读入的也为‘#’时候跳出循环 33 { 34 if(s=='('&&z==')'||s=='#'&&z=='#') 35 return '='; 36 else 37 return '<'; 38 } 39 */ 40 if(s=='('&&z==')') 41 return '='; 42 else 43 return '<'; 44 } 45 46 int main() 47 { 48 int n,len,i; 49 char a[1005]; 50 scanf("%d",&n); 51 while(n--) 52 { 53 stack<char> Optr; 54 memset(a,0,sizeof(a)); 55 Optr.push('#'); 56 scanf("%s",a); 57 len=strlen(a); 58 a[len]='#'; 59 for(i=0;i<=len;) 60 { 61 if(a[i]=='#'&&Optr.top()=='#') 62 break; 63 if(a[i]>='0'&&a[i]<='9'||a[i]=='.') //如果是运算数直接输出 64 { 65 printf("%c",a[i]); 66 i++; 67 } 68 else 69 { 70 switch(precede(Optr.top(),a[i])) 71 { 72 case '<': 73 Optr.push(a[i]); 74 i++; 75 break; 76 case '=': //说明括号或#号成对出现,弹出栈顶的‘(’或者‘#’,括号不用输出 77 Optr.pop(); 78 i++; 79 break; 80 case '>': //输出栈顶元素并弹出栈顶元素 81 printf("%c",Optr.top()); 82 Optr.pop(); 83 break; 84 } 85 } 86 } 87 printf("\n"); 88 } 89 return 0; 90 } 91