天天看点

前缀表达式求值--栈

算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如

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

的前缀表达式是:

+ + 2 * 3 - 7 4 / 8 4

。请设计程序计算前缀表达式的结果值。

输入格式:

输入在一行内给出不超过30个字符的前缀表达式,只包含

+

-

*

\

以及运算数,不同对象(运算数、运算符号)之间以空格分隔。

输出格式:

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

ERROR

输入样例:

+ + 2 * 3 - 7 4 / 8 4

输出样例:

13.0

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 10000
struct node{
    double num[MAX];
    int top;
};
int main(void){
    struct node *stack=(struct node *)malloc(sizeof(struct node));
    stack->top=-1;
    char expr[MAX][40];
    int i=0;
    while(~scanf("%s",expr[i])){
        ++i;        
    }
    for(--i;i>=0;--i){
        if(strlen(expr[i])==1&&(expr[i][0]=='+'||expr[i][0]=='-'||expr[i][0]=='*'||expr[i][0]=='/')){
            if(stack->top>=1){
                switch(expr[i][0]){
                    case '+':stack->num[stack->top-1]=stack->num[stack->top]+stack->num[stack->top-1];
                             stack->top--;
                             break;
                    case '-':stack->num[stack->top-1]=stack->num[stack->top]-stack->num[stack->top-1];
                             stack->top--;
                             break;
                    case '*':stack->num[stack->top-1]=stack->num[stack->top]*stack->num[stack->top-1];
                             stack->top--;
                             break;
                    case '/':if(stack->num[stack->top-1]==0){
                                   printf("ERROR\n");
                                   return 0;
                             }
                             stack->num[stack->top-1]=stack->num[stack->top]/stack->num[stack->top-1];
                             stack->top--;
                             break;
                }
            }
            else{
                printf("ERROR\n");
                return 0;
            }
        }
        else{
            stack->num[++(stack->top)]=atof(expr[i]);
        }
    }
    if(stack->top!=0){
        printf("ERROR\n");
        return 0;
    }
    printf("%.1f\n",stack->num[0]);
    return 0;
}
 
           

继续阅读