zoukankan      html  css  js  c++  java
  • 后缀表达式的计算

    后缀表达式的计算

             对后缀表达式进行计算,得到表达式的值。

             例如有后缀表达式:

    2 1 + 3 *

             其结果应为:

           9

             后缀表达式:

           1 3 5 * + 7 9 / -

             其结果应为:

    15.222

             后缀表达式:

           1 3 + 5 7 - * 9 /

             其结果应为:

           -0.889

             后缀表达式计算程序如下:

    // 后缀表达式的计算
    #include <iostream>
    #include <sstream>
    #include <vector>
    #include <stack>
    #include <map>
    #include <string>
    using namespace std;
    
    void get_postfix(vector<string>& postf)
    {
        postf.clear();
        string line;
        getline(cin, line);
        istringstream sin(line);
        string tmp;
        while (sin >> tmp)
        {
            postf.push_back(tmp);
        }
    }
    
    void init_op(map<string, int>& ops)
    {
        ops.clear();
        ops["+"] = 100;
        ops["-"] = 100;
        ops["*"] = 200;
        ops["/"] = 200;
        ops["("] = 1000;
        ops[")"] = 0;
    }
    
    bool is_operator(const string& hs, const map<string, int>& ops)
    {
        map<string, int>::const_iterator cit = ops.find(hs);
        if (cit != ops.end())
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    
    double cal_post(const vector<string>& postf, const map<string, int>& ops)
    {
        stack<double> or_st;
        double operand = 0.0, a = 0.0, b = 0.0, c = 0.0;
        for (vector<string>::size_type i = 0; i != postf.size(); ++i)
        {
            if (!is_operator(postf[i], ops))
            {
                operand = static_cast<double>(atof(postf[i].c_str()));
                or_st.push(operand);
            }
            else
            {
                switch (postf[i][0])
                {
                case '+':
                    b = or_st.top();
                    or_st.pop();
                    a = or_st.top();
                    or_st.pop();
                    c = a + b;
                    or_st.push(c);
                    break;
                case '-':
                    b = or_st.top();
                    or_st.pop();
                    a = or_st.top();
                    or_st.pop();
                    c = a - b;
                    or_st.push(c);
                    break;
                case '*':
                    b = or_st.top();
                    or_st.pop();
                    a = or_st.top();
                    or_st.pop();
                    c = a * b;
                    or_st.push(c);
                    break;
                case '/':
                    b = or_st.top();
                    or_st.pop();
                    a = or_st.top();
                    or_st.pop();
                    c = a / b;
                    or_st.push(c);
                    break;
                default:
                    break;
                }
            }
        }
        if (or_st.size() == 1)
        {
            return or_st.top();
        }
        else
        {
            return -10000000000000.0;
        }
    }
    
    int main()
    {
        map<string, int> ops;
        init_op(ops);
        vector<string> postf;
        
        while (1)
        {
            get_postfix(postf);
            double ret = cal_post(postf, ops);
            cout << ret << endl << endl;
        }
        
        system("PAUSE");
        return 0;
    }

             上述后缀表达式计算过程中用到了数据结构为,该栈存储的是中间结果的操作数。

             数据结构:

             0.设置一个栈,该栈用于存储中间计算的操作数;

             具体的算法逻辑为:

             1.从左到右顺序扫描整个后缀表达式;

             2.如果是操作数,则将该操作数压入到栈中;

             3.如果是操作符,则从栈中弹出对应的操作数,注意操作数的顺序;根据操作符进行运

                算,并将结果重新压入到栈中;

             4.直至将整个栈扫描完毕;

             5.如果后缀表达式是合法的,则扫描完毕后,栈中只有一个元素,该元素的值即为后缀

                表达式的结果。

  • 相关阅读:
    leetcode 29-> Divide Two Integers without using multiplication, division and mod operator
    ros topic 发布一次可能会接收不到数据
    python中的print()、str()和repr()的区别
    python 部分函数
    uiautomatorviewer错误 unable toconnect to adb
    pyqt 不规则形状窗口显示
    appium 计算器demo
    Spring 3.0 注解注入详解
    Spring Autowire自动装配
    restful 学习地址
  • 原文地址:https://www.cnblogs.com/unixfy/p/3194704.html
Copyright © 2011-2022 走看看