5-21 求前缀表达式的值(25分)

5-21 求前缀表达式的值(25分)

算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4。请设计程序计算前缀表达式的结果值。

输入格式:

输入在一行内给出不超过30个字符的前缀表达式,只包含+-*以及运算数,不同对象(运算数、运算符号)之间以空格分隔。

输出格式:

输出前缀表达式的运算结果,保留小数点后1位,或错误信息ERROR

输入样例:

+ + 2 * 3 - 7 4 / 8 4

输出样例:

13.0

用前缀表达式求值的思路还是非常清楚的,很快就写完了,找了几个数据测试也都通过了,但是在浙大的平台上提交一个数据点都没有通过,膝盖都要跪烂掉了。。。。。望大神指正。。。
我过段时间再回头看看这道题目吧。。

代码:
 1 #include<iostream>
 2 #include<string.h>
 3 #include<stdio.h>
 4 #include<stdlib.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 float Push(Sqstack &S,float 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 float GetTop(Sqstack S,float &e)//返回头顶指针
39 {
40     if(S.top==S.base)
41         return ERROR;
42     else
43         return e=*(S.top-1);
44 }
45 
46 float Pop(Sqstack &S,float &e)
47 {
48     if(S.top==S.base)
49         return ERROR;
50     else
51         return e=*--S.top;
52 }
53 
54 float before(char A[],int len)
55 {
56     int i;float x1,x2,temp=1;
57     float e;
58     Sqstack bds;
59     InitStack(bds);
60     for(i=len-1;i>=0;i--)
61     {
62         if('0'<=A[i]&&A[i]<='9')
63             Push(bds,A[i]-'0');
64         else {
65             Pop(bds,x2);
66             Pop(bds,x1);
67             switch(A[i])
68             {
69                 case '+':temp=x1+x2;break;
70                 case '-':temp=x2-x1;break;
71                 case '*':temp=x1*x2;break;
72                 case '/':{
73                     if(x1==0)
74                 {
75                     cout<<ERROR<<endl;
76                     return ERROR;}
77                     else
78                     { temp=x2/x1;break;}
79                 }
80             }
81             Push(bds,temp);
82         }
83     }
84     GetTop(bds,e);
85     return e;
86 }
87 
88 int main()
89 {
90     char pre[30];int len;
91     float e;
92     scanf("%s",pre);//输入前缀表达式
93     len=(int)strlen(pre);
94     e=before(pre,len);//输出前缀表达式的计算值
95     printf("%.1f
",e);
96     return 0;
97 }


 


原文地址:https://www.cnblogs.com/guohaoyu110/p/6358663.html