用C语言实现求前缀表达式的值

时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4。请设计程序计算前缀表达式的结果值。 输入格式说明: 输入在一行内给出不超过30个字符的前缀表达式,只包含+、-、*、\以及运算数,不同对象(运算数、运算符号)之间以空格分隔。 输出格式说明: 输出前缀表达式的运算结果,精确到小数点后1位,或错误信息“ERROR”。 样例输入与输出: 序号 输入 输出 1 + + 2 * 3 - 7 4 / 8 4 13.0 2 / -25 + * - 2 3 4 / 8 4 12.5 3 / 5 + * - 2 3 4 / 8 2 ERROR 4 +10.23 10.2

如果你肯先采纳答案,可以给你一些代码

 #include <iostream>
#include <list>
#include <stack>
#include <sstream>
#include <cstdlib>
using namespace std;

class node {
    public:
        double val;
        char op;
        bool is_op;
};
void parse(list<node*>&);
bool calc(list<node*> &tokens, double &result);
double calcx(double a, double b, char op);
void clear(list<node*> &tokens);
int main() {
    list<node*> tokens;
    parse(tokens);
    double res = 0.0;
    if (calc(tokens,res)) {
        printf("%.1f\n", res);
    } else {
        cout<<"ERROR"<<endl;
    }
    clear(tokens);
    //system("pause");
}

void clear(list<node*> &tokens) {
    list<node*>::iterator iter = tokens.begin();
    for(; iter != tokens.end(); iter++) {
        delete *iter;
    }
    tokens.clear();
}

double calcx(double a, double b, char op) {
    switch(op) {
        case '+':return a+b;break; 
        case '-':return a-b;break;
        case '*':return a*b;break;
        case '/':return a/b;break;
        default:return 0;   
    }
}

bool calc(list<node*> &tokens, double &result) {
    stack<double> nums;
    list<node*>::iterator iter = tokens.begin();
    for (; iter != tokens.end(); iter++) {
        node* n = *iter;
        if (n->is_op) {
            if (nums.size() < 2) {
                return false;
            } else {
                double a = nums.top();
                nums.pop();
                double b = nums.top();
                nums.pop();
                if (n->op == '/' && b == 0) return false;
                nums.push(calcx(a, b, n->op));
            }
        } else {
            nums.push(n->val);
        }
    }
    if (nums.size() != 1) {
        return false;
    } else {
        result = nums.top();
        return true;
    }
}
bool is_op(char ch) {
    return ch == '+' || ch == '-' || ch == '*' || ch == '/';
}
void parse(list<node*> &tokens) {
    char buf[30];
    stringstream stream;
    double value = 0;
    while(cin>>buf) {
        node* n = new node();
        if (buf[1] == 0 && is_op(buf[0])) { //  operator
            n->is_op = true;
            n->op = buf[0];
        } else { // number
            stream.clear();
            stream<<buf;
            stream>>value;
            n->val = value;
            n->is_op = false;
        }
        tokens.push_front(n);
    }
}