superdu1
superdu12138
2015-04-17 10:43
采纳率: 60%
浏览 4.2k
已采纳

用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

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • caozhy
    已采纳

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

    点赞 评论
  • devmiao
    devmiao 2015-04-17 18:25
     #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);
        }
    }
    
    点赞 评论

相关推荐