后缀表达式求值

时间:2020-12-23 11:30:44

问题 H: 后缀表达式求值
时间限制: 1 Sec 内存限制: 128 MB
提交: 1042 解决: 460
[提交][状态][讨论版]
题目描述
为了便于处理表达式,常常将普通表达式(称为中缀表示)转换为后缀{运算符在后,如X/Y写为XY/表达式。在这样的表示中可以不用括号即可确定求值的顺序,如:(P+Q)(R-S) → PQ+RS-。后缀表达式的处理过程如下:扫描后缀表达式,凡遇操作数则将之压进堆栈,遇运算符则从堆栈中弹出两个操作数进行该运算,将运算结果压栈,然后继续扫描,直到后缀表达式被扫描完毕为止,此时栈底元素即为该后缀表达式的值。
输入
输入一行表示后缀表达式,数与数之间一定有空格隔开(可能不只一个空格),最后输入@表示输入结束。

数据保证每一步的计算结果均为不超过100000的整数。

输出
输出一个整数,表示该表达式的值.
样例输入
14 3 20 5 / *8 - + @
样例输出
18

#include<stdio.h>
#include<stdlib.h>
#define maxsize 1000
typedef struct
{
    int *base;
    int *top;
    int stacksize;
}sqstack;
void initstack(sqstack &S)
{
    S.base=new int[maxsize];
    S.top=S.base;
    S.stacksize=maxsize;
}
int stackemperty(sqstack S)
{
    if(S.top==S.base)
        return 1;
    return 0;
}
int stackfull(sqstack S)
{
    if(S.top-S.base==S.stacksize)
        return 1;
    return 0;
}
void push(sqstack &S,int e)
{
    if(S.top-S.base==S.stacksize) {printf("full!\n");exit(0);}
    *S.top++=e;
}
void pop(sqstack &S,int &e)
{
    if(S.top==S.base) {printf("emperty\n");exit(0);}
    e=*--S.top;
}
void calculate(int num1,int num2,char op,int &sum)
{
    switch(op)
    {
        case'-':sum=num1-num2;break;
        case'+':sum=num1+num2;break;
        case'*':sum=num1*num2;break;
        case'/':sum=num1/num2;break;
    }
}
int main()
{
    char b[100],op,d[100];
    int c[100],a,sum,num1,num2;
    int i,num=0,flag=1,flag2=1,k=0,j,l=0;
    sqstack L;
    initstack(L);
    gets(b);
    for(i=0;b[i]!='\0';i++)
    {
        /*if(b[i]==' '&&flag==0) {flag=0;num=0;} if(b[i]=='+'||b[i]=='-'||b[i]=='/'||b[i]=='*'&&(flag==0||flag2==1))
        {
            c[k++]=b[i];
            flag2=1;
            flag=0;
            num=0;
        }if(b[i]=='+'||b[i]=='-'||b[i]=='/'||b[i]=='*'&&flag==1)
        {
            c[k++]=num+'0';flag=0;
            c[k++]=b[i];
        }
        if(b[i]==' '&&flag&&flag2==0) {c[k++]=num+'0';flag=0;num=0;}
        if(b[i]>='0'&&b[i]<='9')
            {num=num*10+b[i]-'0';flag=1;}*/
        /*if(b[i]==' '||(b[i]=='+'||b[i]=='-'||b[i]=='/'||b[i]=='*'))
            flag=0;*/
        if((b[i]=='+'||b[i]=='-'||b[i]=='/'||b[i]=='*')&&flag==0)
            {d[l++]=b[i];c[k++]=maxsize;}
        if(b[i]>='0'&&b[i]<='9'&&b[i]!=' ')
            {num=num*10+b[i]-'0';
            flag=1;}
        if((b[i]==' '||b[i]=='+'||b[i]=='-'||b[i]=='/'||b[i]=='*')&&flag==1)
        {
            c[k++]=num;d[l++]='#';
            num=0;flag=0;
            if(b[i]=='+'||b[i]=='-'||b[i]=='/'||b[i]=='*')
            {d[l++]=b[i];c[k++]=maxsize;}
        }
    }
    //printf("%d\n",k);
    for(j=0;j<k;j++)
    {
        //printf("%d %c\n",c[j],d[j]);
        if(c[j]!=maxsize&&d[j]=='#')
            push(L,c[j]);
        else
        {
            if(!stackemperty(L))
           {pop(L,num2);
           pop(L,num1);
           calculate(num1,num2,d[j],sum);
           }
           if(!stackfull(L))
           push(L,sum);
        }
    }
    pop(L,sum);
    printf("%d\n",sum);
}

/*#include<stdio.h>
int main()
{
    int a;
    char c;
    while(~scanf("%d",&a))
    {
        c=a+'0';
        printf("%c\n",c);
    }
}*/