zoukankan      html  css  js  c++  java
  • 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      
    功不成,身已退
  • 相关阅读:
    POJ1486 Sorting Slides 二分图or贪心
    POJ2060 Taxi Cab Scheme 最小路径覆盖
    POJ3083 Children of the Candy Corn 解题报告
    以前的文章
    POJ2449 Remmarguts' Date K短路经典题
    这一年的acm路
    POJ3014 Asteroids 最小点覆盖
    POJ2594 Treasure Exploration 最小路径覆盖
    POJ3009 Curling 2.0 解题报告
    POJ2226 Muddy Fields 最小点集覆盖
  • 原文地址:https://www.cnblogs.com/dongsheng/p/2624211.html
Copyright © 2011-2022 走看看