zoukankan      html  css  js  c++  java
  • 中缀式变后缀式

    中缀式变后缀式

    时间限制: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 / =

    题解:主要完毕对数组postexp中指定位置加入空格。

    程序代码:

    #include<stdio.h>

    #include<stdlib.h>

     

    #define MaxSize 1000

    #define MaxOp   7

     

    struct   //设定运算符优先级

    {

      char ch;   //运算符

      int pri;   //优先级 

    } lpri[]={{'=',0},{'(',1},{'*',5},{'/',5},{'+',3},{'-',3},{')',6}}, 

      rpri[]={{'=',0},{'(',6},{'*',4},{'/',4},{'+',2},{'-',2},{')',1}};

        

    int leftpri(char op)    //求左运算符op的优先级

    {  

       int i;

       for (i=0;i<MaxOp;i++)

      if (lpri[i].ch==op) 

           return lpri[i].pri;

    }

     

    int rightpri(char op)  //求右运算符op的优先级

    {  

       int i;

       for (i=0;i<MaxOp;i++)

      if (rpri[i].ch==op) 

           return rpri[i].pri;

    }

     

    int InOp(char ch)       //推断ch是否为运算符

    {  

       if (ch=='(' || ch==')' || ch=='+' || ch=='-' || ch=='*' || ch=='/')

      return 1;

       else

      return 0;

    }

     

    int Precede(char op1,char op2)  //op1op2运算符优先级的比較结果

      if (leftpri(op1)==rightpri(op2))

        return 0;

      else if (leftpri(op1)<rightpri(op2))

     return -1;

      else

     return 1;

    }

     

    void trans(char *exp,char postexp[])     

    //将算术表达式exp转换成后缀表达式postexp

    {  

       struct

       {  

          char data[MaxSize]; //存放运算符

       int top; //栈指针

       } op; //定义运算符栈

       int i=0; //i作为postexp的下标

       op.top=-1;

       op.top++;                  //'='进栈

       op.data[op.top]='='; 

       while (*exp!='') //exp表达式未扫描完时循环

       {  

          if(*exp=='=')

            break;

          if (!InOp(*exp)) //为数字字符的情况

       {  

             while (*exp>='0' && *exp<='9' || *exp=='.') //判定为数字

          {  

               postexp[i++]=*exp;

            exp++;

             }

       //   postexp[i++]='#'; //#标识一个数值串结束

          postexp[i++]=' ';

       }

         else //为运算符的情况

        switch(Precede(op.data[op.top],*exp))

        {

          case -1:    //栈顶运算符的优先级低:进栈

              op.top++;

                    op.data[op.top]=*exp;

              exp++;    //继续扫描其它字符

              break;

          case 0:    //仅仅有括号满足这样的情况

             op.top--;    //(退栈

                exp++;    //继续扫描其它字符

             break;

          case 1:             //退栈并输出到postexp

             postexp[i++]=op.data[op.top];

             postexp[i++]=' ';

                   op.top--;

             break;

        }

       } //while (*exp!='')

       while (op.data[op.top]!='=') 

            //此时exp扫描完成,退栈到'='为止

       {  

         postexp[i++]=op.data[op.top];

         postexp[i++]=' ';

      op.top--;  

       }

       postexp[i++]='='; //postexp表达式加入结束标识

       postexp[i++]='';

    }

     

    int main()

    {  

       int n;

       scanf("%d",&n);

       getchar();

       while(n--)

       {

         char exp[MaxSize];

         scanf("%s",exp);

         char postexp[MaxSize];

         trans(exp,postexp);

         printf("%s ",postexp);  

       }

       system("pause");

       return 0;

    }

     

     

  • 相关阅读:
    2019-07-08 L410 EST科技英语翻译
    L405 NYC-ATF4
    L403 Royal espionage
    L402 EST
    L401 哭声识别
    L400 How Trees Affect the Weather
    L398
    final, finally, finalize 的区别
    try {}里有一个 return 语句, 那么紧跟在这个 try 后的 finally {}里的 code会不会被执行,什么时候被执行,在 return 前还是后?
    下 面 这 条 语 句 一 共 创 建 了 多 少 个 对 象 : String s="a"+"b"+"c"+"d";
  • 原文地址:https://www.cnblogs.com/lxjshuju/p/6767970.html
Copyright © 2011-2022 走看看