zoukankan      html  css  js  c++  java
  • 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 Code
     1  
     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         //system("pause");              
    81     }
    82         return 0;
    83 }
    84         

    -------------------------------------------

    作者:赵杰迪

    -------------------------------------------

  • 相关阅读:
    Spring Boot构建RESTful API与单元测试
    Spring Boot中使用Swagger2构建强大的RESTful API文档
    Intellij IDEA 一些不为人知的技巧
    Spring中@Controller和@RestController之间的区别
    Spring 中的default-lazy-init="true" 和 lazy-init="true"
    SpringMVC处理JSON
    建立一个简单的SpringMVC程序
    SpringMVC处理静态资源
    <mvc:annotation-driven/>与<mvc:default-servlet-handler/>之间的一个问题
    Spring AOP 简单理解
  • 原文地址:https://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi1992_2012_10_2600.html
Copyright © 2011-2022 走看看