中缀到Postfix来应答程序(思考过程对吗?)

时间:2015-11-20 09:36:23

标签: c++ postfix-notation

我知道这里已有关于此的内容,但我只是张贴以检查我的逻辑是否符合我的代码(如果我正在考虑的话)这整个中缀Postfix就像我应该的方式。)

我在本网站上看到的有关此主题的代码与我的有点不同。我是C ++的新手。无论如何,到目前为止,我的代码看起来很好,应该可以正常工作,但它不能正常工作。我在下面的代码中将我的思维过程作为评论。如果我的想法没问题,请告诉我。

以下是代码:

#include <iostream>
#include <stack>
#include <sstream>
#include <string>

using namespace std;


int priority (string item)
{
    int prior = 0;

    if (item == "(")
    {
        prior = 1;
    }


    if ((item == "+") || (item == "-"))
    {
        prior = 2;
    }

    else if ((item == "*") || (item == "/"))
    {
        prior = 3;
    }

    else
    {
        prior = 4;
    }

    return prior;
}


int main()
{

    stack<string> st;

    string output;

    cout << "Welcome. This program will calculate any arithmetic expression you enter" << endl;
    cout << "Please enter an arithmetic expression below: " << endl;

    char line[256];
    cin.getline(line, 256);

    string exp;
    exp = line;

    cout << "This is the expression you entered: ";
    cout << exp << endl;

    string item;

    istringstream iss(exp);

    iss >> item;

    // While there are still items in the expression...
    while ( iss )
    {
        // If the item is a number
        if (isdigit('item') == true)
        {
            output = output + " " + item;
        }

        // If the stack is empty
        else if (st.size() == 0)
        {
            st.push(item);
        }

        // If the item is not a number
        else if (isdigit('item') == false)
        {
            // convert that item in the expression to a string
            atoi(item.c_str());

            int prior1 = 0;
            int prior2 = 0;

            // If that string is a LEFT PARENTHESIS
            if (item == "(")
            {
                st.push(item);
            }

            // If that string is a RIGHT PARENTHESIS
            else if (item == ")")
            {
                while ((st.empty() == false) && (st.top() != "("))
                {
                    output = st.top() + " ";
                    st.pop();
                }
                st.pop();
            }

            else
            {
                // store what is returned from "priority" in "prior1"
                prior1 = priority(item);

                // pass item on top of the stack through "priority"
                // store that in "prior2;
                prior2 = priority(st.top());


                // while loop here, while item has a higher priority...
                // store numbers in a variable

                while (prior1 > prior2)
                {
                    output = output + " " + st.top();
                    st.pop();
                    prior2 = priority(st.top());
                }
            }
        }
    }

    while (st.empty() == false)
    {
        output = st.top() + " ";
        st.pop();
    }

    cout << "Here's the postfix: " << output << endl;
}

这是用于评估实际答案的后缀:

    // EVALUATE POSTFIX

    stack<int> st2;

    string output2;

    istringstream iss2(exp);

    iss2 >> item;

    while (iss)
    {
        // If the item is a number
        if (isdigit('item') == true)
        {
            st.push(item);
        }

        if (isdigit('item') == false)
        {

            // store item in a variable
            // pop another item off the stack
            // store that in a variable.
            // apply operator to both.
            // push answer to the top of the stack.

            int m = 0;
            int n = 0;
            int total = 0;

            m = st2.top();
            st2.pop();
            n = st2.top();
            st2.pop();

            if (item == "+")
            {
                total = m + n;
                st2.push(total);
            }

            else if (item == "-")
            {
                total = m - n;
                st2.push(total);
                // add the thing you popped of the stack with the first thing on the stack
            }

            else if (item == "*")
            {
                total = m * n;
                st2.push(total);
            }

            else if (item == "/")
            {
                total = m / n;
                st2.push(total);
            }
        }
    }
    cout << "Here's your answer: " << st2.top() << endl;
}

我是否应该以这种方式思考整个中缀后缀的问题?我有没有解决这个问题?如果这个问题看似简单,我道歉。我是一个新手。非常感谢你。

0 个答案:

没有答案