後綴表達式的計算

後綴表達式的計算ios

         對後綴表達式進行計算,獲得表達式的值。算法

         例若有後綴表達式:數據結構

2 1 + 3 *post

         其結果應爲:spa

       93d

         後綴表達式:code

       1 3 5 * + 7 9 / -blog

         其結果應爲:ci

15.222get

         後綴表達式:

       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.若是後綴表達式是合法的,則掃描完畢後,棧中只有一個元素,該元素的值即爲後綴

            表達式的結果。

相關文章
相關標籤/搜索