中缀式变后缀式

中缀式变后缀式

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

}

 

 

原文地址:https://www.cnblogs.com/lxjshuju/p/6767970.html