• 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 }
    
    
    
     


  • 相关阅读:
    从量子加密到机器学习,盘点2015阿里云开放的黑科技
    架构设计:系统存储(24)——数据一致性与Paxos算法(中)
    深入理解Git (一) - 元数据
    IOS Using UIAlertView to show alerts
    gdal hdfs接口数据读取
    /usr/lib64/python2.6/site-packages/pycurl.so: undefined symbol: CRYPTO_set_locking_callback
    linux jexus mono 发布.net webservices web页面
    docker中使用systemd
    基于Open vSwitch搭建虚拟路由器
    Openstack Neutron DVR workflow
  • 原文地址:https://www.cnblogs.com/guohaoyu110/p/6358663.html
Copyright © 2020-2023  润新知