• 后缀表达式 NYOJ 257


    一个算术表达式,含有数字(为简化处理,数字只有一位),运算符:+-*,以及括号,求表达式的值。

     给出的表达式是一般我们见到的中缀表达式,即运算符位于操作数之间。如果把中缀表达式转化为后缀表达式,那么对后缀表达式求值将会很方便。

     后缀表达式特点

      1.操作符位于操作数之后;

      2.没有括号;

      3.运算符没有优先级。

     中缀表达式转化为后缀表达式的步骤

      1.初始化一个空操作符栈和空结果字符串;

      2.从前到后读取中缀表达式的字符,如果是操作数,加到结果字符串后面;

      3.如果是操作符,分两种情况入栈:

        a.如果待入栈操作符优先级大于栈顶操作符,直接入栈;

        b.如果待入栈操作符优先级小于或等于栈顶操作符,栈顶操作符加到结果字符串后面;重复b过程直到遇到前括号‘(’或栈顶操作符优先级比待入栈操作符小,待入栈操作符入栈。

      4.如果是前括号‘(’,直接入栈;

      5.如果是后括号,将栈中操作符依次弹出,直至遇到一个前括号‘(’结束。前括号出栈。

      最后结果字符串就是后缀表达式。

      后缀表达式求值的步骤

      1.初始化一个空操作数栈;

      2.从前到后读取后缀表达式字符。如果是操作数直接入栈。如果读到一个操作符@,弹出栈顶元素a和新的栈顶元素b,执行b @ a,将结果压入栈中;

      3.最后栈中只剩下一个元素,即表达式的值。

     

    郁闷的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 #include<stdio.h>
     2 #include<string.h>
     3 #include<stack>
     4 using namespace std;
     5 
     6 char a[1010];
     7 char b[1010];
     8 stack<char>s;
     9 
    10 int fun(char x)
    11 {
    12     switch(x)
    13     {
    14     case '+':
    15     case '-':return 1;
    16     case '*':
    17     case '/':return 2;
    18     case '(':return 0;
    19     default :return -1;
    20     }
    21 }
    22 
    23 
    24 int main()
    25 {
    26     int i,j,t,m;
    27     s.push('#');
    28     scanf("%d",&t);
    29     while(t--)
    30     {
    31         j=0;
    32         scanf("%s",a);
    33         memset(b,0,sizeof(b));
    34         m=strlen(a);
    35         for(i=0;i<m;i++)
    36         {
    37             if(a[i]>='0'&&a[i]<='9'||a[i]=='.')  b[j++]=a[i];
    38             else if(a[i]=='(')  s.push(a[i]);
    39             else if(a[i]==')')  
    40             {
    41                 while(s.top()!='(') 
    42                 {
    43                     b[j++]=s.top();
    44                     s.pop();
    45                 }
    46                 s.pop();
    47             }
    48             else 
    49             {
    50                 while(fun(s.top())>=fun(a[i]))
    51                 {
    52                     b[j++]=s.top();
    53                     s.pop();
    54                 }
    55                 s.push(a[i]);
    56             }
    57 
    58         }
    59         while(s.top()!='#')
    60         {
    61             b[j++]=s.top();
    62             s.pop();
    63         }
    64         b[j]='\0';
    65         puts(b);
    66     }
    67     return 0;
    68 }
  • 相关阅读:
    Dubbo学习记录(一)
    Quartz定调度简单案例
    oracle中批量生成字段类型的脚本
    MsSQLserver中修改字段值系统自动生成的脚本
    根据oracle的主键列生成SQLserver的主键
    SQLServer2005如何批量修改架构名
    win10 下oracle tns通过IP无法访问的解决办法
    PD PDM模型中关系设置为概念模型样式
    PB12.5.2安装
    Java Web 项目目录规范
  • 原文地址:https://www.cnblogs.com/xiaofanke/p/3106391.html
Copyright © 2020-2023  润新知