• NYOJ 257 郁闷的C小加(一)


     

    郁闷的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      
    功不成,身已退
  • 相关阅读:
    关于JQ的$.deferred()
    JS去掉数组的重复项
    JS中iframe相关的window.self,window.parent,window.top
    JQ的live(),on(),deletage(),bind()几个的区别
    个人对闭包的理解
    ajax 代码
    Don't use runAllManagedModulesForAllRequests="true" when getting your MVC routing to work
    SQL语句收集
    性能速度
    ADO.NET(SqlConnection、SqlCommand、SqlDataAdapter、SqlTransaction、SqlParameter、DataSet)
  • 原文地址:https://www.cnblogs.com/dongsheng/p/2624211.html
Copyright © 2020-2023  润新知