郁闷的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      

 

posted on 2012-08-05 21:10  可笑痴狂  阅读(342)  评论(0编辑  收藏  举报