NYOJ467 中缀式变后缀式
中缀式变后缀式
时间限制: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 / =
View Code1 2 #include <cstdio> 3 #include <cstring> 4 #include <stack> 5 #include <cctype> 6 #include <cstdlib> 7 using namespace std; 8 char str[1005]; 9 char pp[7]={'+','-','*','/' ,'(' ,')'}; 10 bool cmp(char a,char b) 11 { 12 char ch[6][6]= 13 { 14 {'>','>','<','<','<','>'},//栈顶和新输入的比较 15 {'>','>','<','<','<','>'}, 16 {'>','>','>','>','<','>'}, 17 {'>','>','>','>','<','>'}, 18 {'<','<','<','<','<','='}, 19 {'>','>','>','>',' ','>'} 20 }; 21 for(int i=0;i<6;i++) 22 { 23 if(a==pp[i])a=i; 24 if(b==pp[i])b=i; 25 } 26 if(ch[a][b]=='>'||ch[a][b]=='=')return true; 27 return false; 28 } 29 int main() 30 { 31 int i,j,k,T; 32 scanf("%d%*c",&T); 33 while(T--) 34 { 35 stack <char> s; 36 memset(str,0,sizeof(str)); 37 gets(str); 38 int len = strlen(str); 39 s.push(str[len-1]);//要先等号入栈 40 for(i=0;i<len-1;i++) 41 { 42 if(isdigit(str[i]))//数字就直接输出 43 { 44 j=i+1; 45 while(isdigit(str[j])||str[j]=='.') 46 j++; 47 for(k=i;k<=j-1;k++) 48 printf("%c",str[k]); 49 putchar(' '); 50 i=j-1;//注意 i的取值: 51 } 52 else if(str[i]=='(') 53 s.push(str[i]); 54 else if(str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/') 55 { 56 if(s.empty()) s.push(str[i]); 57 while(cmp(s.top(),str[i])&&s.size()!=1)//不处理最后的等号 58 { 59 printf("%c ",s.top()); 60 s.pop(); 61 } 62 s.push(str[i]); 63 } 64 else if(str[i]==')') 65 { 66 while(s.top()!='('&&s.size()!=1) 67 { 68 printf("%c ",s.top()); 69 s.pop(); 70 } 71 s.pop();//去掉左括号 72 } 73 } 74 while(!s.empty()&&s.size()!=1) 75 { 76 printf("%c ",s.top()); 77 s.pop(); 78 } 79 printf("=\n"); 80 81 } 82 return 0; 83 } 84
posted on 2012-11-02 08:53 LinuxPanda 阅读(279) 评论(0) 编辑 收藏 举报