20-表达式求值

Posted ystraw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20-表达式求值相关的知识,希望对你有一定的参考价值。

/*
表题目内容:

 输入一个由数字、+,-,*,/ 组成的算术表达式,求其值。

输入描述

一个表达式,其中每个运算数为正整数

输出描述

计算结果,保留2位小数

输入样例

1+12*3-4/2

输出样例

35.00
 
*/
#include <iostream>
#include <cstdio>
#include <stack>
using namespace std;
    
int fu(char ch){
    if(ch == ‘#‘ || ch == ‘=‘)
        return 0;
    if(ch == ‘-‘ || ch == ‘+‘)
        return 1;
    if(ch == ‘*‘ || ch == ‘/‘)
        return 2;    
}

void qiuzhi(string str){
    int i = 0;
    stack <double>s;  //数字栈
    stack <char>f;    //符号栈    优先级低的高的进栈,比栈顶低,则弹出栈顶的进行运算,直到比栈顶高才进栈
    f.push(‘#‘);
    while(str[i]){
        int a = 0, flag = 0;
        while(str[i] >= ‘0‘ && str[i] <= ‘9‘){
            a = a * 10 + str[i] - ‘0‘;
            i++;
            flag = 1;
        }
        if(flag)
            s.push(a);
        if(fu(str[i]) >= fu(f.top())){
            f.push(str[i]);  
            i++;    
        }
        int flag1 = 0;
        while(fu(str[i]) < fu(f.top())){
            char ch = f.top();
            f.pop();
            double c, d, e;
            c = s.top(); s.pop();
            d = s.top(); s.pop();
            if(ch == ‘-‘)
                e = d - c;
            else if(ch == ‘+‘)
                e = d + c;            
            else if(ch == ‘*‘)
                e = d * c;
            else if(ch == ‘/‘)
                e = d * 1.0 / c;        
            s.push(e);
//            f.push(str[i]);    
            flag1 = 1;
        }
        if(flag1){
            if(str[i] == ‘=‘){
                double sum = s.top();
                printf("%.2lf", sum);
//                cout << sum;
                return;
            }
            f.push(str[i]);
            i++;
        }
    }
}

int main(){
    string str;
    cin >> str;
    str += ‘=‘;
    qiuzhi(str);    
//    cout << str;
    return 0;
}

以上是关于20-表达式求值的主要内容,如果未能解决你的问题,请参考以下文章

java实现表达式求值 (20 分)-------非递归版

nyoj305_表达式求值

表达式求值

表达式求值

python 短路求值或惰性求值

表达式求值