zoukankan      html  css  js  c++  java
  • 【后序式的运算】

    /*
    后序式的运算
     
    说明:
    将中序式转换为后序式的好处是,不用处理运算子先后顺序问题,只要依序由运算式由前往后读取即可。
    
    解法:
    运算时由后序式的前方开始读取,遇到运算元先存入堆叠,如果遇到运算子,则由堆叠中取出两个运算元进行对应的运算,然后将
    结果存回堆叠,如果运算式读取完毕,那么堆叠顶的值就是答案了,例如我们计算12+34+* 这个运算式
    (也就 是(1+2)*(3+4) ): 
    读取    堆叠
    1        1
    2        12
    +        3
    3        33        (1+2后存回)
    4        334
    +        37         (3+4后存回)
    *        21        (3*7后存回)
    
    */ 
    
    
    
    #include <stdio.h>
    #include <stdlib.h>
    
    void evalPf(char* );
    double cal(double, char, double);
    
    int main(void)
    {
        char input[80];
        printf("input the postfix: ");
        scanf("%s", input);
        evalPf(input);
        return 0;
    }
    
    void evalPf(char* postfix)
    {
        double stack[80] = {0.0};
        char temp[2];
        char token;
        int top = 0, i = 0;
        
        temp[1] = '';
        
        while(1)
        {
            token = postfix[i];
            switch(token)
            {
                case '':
                    printf("ans = %f 
    ", stack[top]);
                    return;
                case '+':
                case '-':
                case '*':
                case '/':
                    stack[top-1] = cal(stack[top], token, stack[top-1]);
                    top--;
                    break;
                default:
                    if(top < sizeof(stack) / sizeof(float))
                    {
                        temp[0] = postfix[i];
                        top++;
                        stack[top] = atof(temp);
                    }
                    break;
            }
            i++;
        }
    }
    
    double cal(double p1, char op, double p2)
    {
        switch(op)
        {
            case '+':
                return p1 + p2;
            case '-':
                return p1 - p2;
            case '*':
                return p1 * p2;
            case '/':
                return p1 / p2;
        }
    }

    运行结果:

  • 相关阅读:
    操作系统、存储介质以及电信行业单位换算差异
    Luogu P1659 [国家集训队]拉拉队排练
    AC自动机
    KMP
    Luogu P1470 最长前缀 Longest Prefix
    Luogu P2292 [HNOI2004]L语言
    Manacher算法
    字典(Trie)树
    逆序对
    vs
  • 原文地址:https://www.cnblogs.com/libra-yong/p/6360118.html
Copyright © 2011-2022 走看看