5-20 表达式转换 (25分)

Posted 女王公园的八神

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了5-20 表达式转换 (25分)相关的知识,希望对你有一定的参考价值。

5-20 表达式转换 (25分)

算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。 
输入格式:

输入在一行中给出不含空格的中缀表达式,可包含+、-、*、\以及左右括号( ),表达式不超过20个字符。 
输出格式:

在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。 
输入样例:

2+3*(7-4)+8/4

输出样例:

2 3 7 4 - * + 8 4 / +


代码:
  1 #include<iostream>
  2 #include<stdio.h>
  3 #include<stdlib.h>
  4 #include<string.h>
  5 using namespace std;
  6 #define ERROR 0
  7 #define OK 1
  8 #define OVERFLOW -2
  9 #define TRUE 1
 10 #define FALSE 0
 11 typedef struct Node *ptr;
 12 typedef struct Node{
 13     int *base;//头指针
 14     int *top;//尾指针
 15     int stacksize;//最大容量
 16 }Sqstack;
 17 
 18 int InitStack(Sqstack &S)   //此处是构造一个空栈
 19 {
 20     S.base = (int *)malloc(100 *sizeof(int));
 21     if (!S.base)  exit(OVERFLOW);
 22     S.top = S.base;
 23     S.stacksize = 100;
 24     return OK;
 25 }
 26 int Push(Sqstack &S,char e)//入栈操作
 27 {
 28     if(S.top-S.base>=S.stacksize)
 29     {
 30         S.base=(int *)realloc(S.base,(S.stacksize+10)*sizeof(int));
 31         if(!S.base) exit(OVERFLOW);
 32         S.top=S.base+S.stacksize;
 33         S.stacksize+=10;
 34     }
 35     *S.top++=e;
 36     return OK;
 37 }
 38 char GetTop(Sqstack S,char &e)//返回头顶指针
 39 {
 40    if(S.top==S.base)
 41        return ERROR;
 42     else
 43         return e=*(S.top-1);
 44  }
 45 
 46 char Pop(Sqstack &S,char &e)
 47 {
 48     if(S.top==S.base)
 49         return ERROR;
 50     else
 51         return e=*--S.top;
 52 }
 53 
 54 int isoperator(char op)
 55 {
 56     switch(op)
 57     {
 58             case +:
 59             case -:
 60             case *:
 61             case /:
 62                      return 1;
 63             default:
 64                      return 0;
 65     }
 66 }
 67 
 68 int Priority(char op)
 69 {
 70     switch(op)
 71     {
 72         case #:return -2;
 73         case +:
 74         case -:
 75             return 1;
 76         case *:
 77         case /:
 78             return 2;
 79         case (: return -1;
 80         case ): return 2;
 81         default: return -1;
 82     }
 83 }
 84 
 85 void postfix(char mid[],char post[],int len)//将中缀表达式转为后缀表达式
 86 {
 87     int i,j=0; char e;
 88     Sqstack abs;
 89     InitStack(abs);
 90     Push(abs,#);
 91     for(i=0;i<len;i++)
 92     {
 93       if(mid[i]>=0&&mid[i]<=9)
 94       {
 95           post[j]=mid[i];
 96           j++;
 97       }
 98       else if(isoperator(mid[i]))//如果接受到的符号是加减乘除的话
 99       {
100           while(Priority(mid[i])<=Priority(GetTop(abs,e)))
101           {
102               post[j]=Pop(abs,e);
103               j++;
104           }
105           while(Priority(mid[i])>Priority(GetTop(abs,e)))
106               Push(abs,mid[i]);
107         
108       }
109       else if(mid[i]==()
110           Push(abs,mid[i]);
111       else if(mid[i]==))
112       {
113           while(GetTop(abs,e)!=()
114           {
115               post[j]=Pop(abs,e);
116               j++;
117           }
118           Pop(abs,e);
119       }
120     }
121     while(GetTop(abs,e)!=#)
122     {
123         post[j]=Pop(abs,e);
124         j++;
125     }
126 }
127 int main()
128 {
129     char mid[21],post[21];
130     int len;
131     scanf("%s",mid);//输入一个中缀表达式
132     len=(int)strlen(mid);
133     postfix(mid,post,len);
134     for(int i=0;i<len;i++)
135     {
136         cout<<post[i];
137     }
138     cout<<endl;
139     return 0;
140 }

很惭愧,最后的结果没有通过所有的数据点,当然例子里面的数据是肯定没问题的,我不知道自己哪些情况没有考虑进去,如果你们发现了,欢迎在下面的评论区告诉我QAQ

 

以上是关于5-20 表达式转换 (25分)的主要内容,如果未能解决你的问题,请参考以下文章

表达式转换 (25 分)

习题3.11 表达式转换(25 分)浙大版《数据结构(第2版)》题目集

7-20 表达式转换

第04次作业-树

PTA中缀表达式转换为后缀表达式并求值 (10 分)

第四次作业 树