任何人都可以帮我找出为什么我的后缀转换无法正常工作?

时间:2014-12-07 19:59:14

标签: stack pop postfix-notation infix-notation

我正在尝试从中缀转换为后缀(我还有更多工作要做)但我甚至无法继续工作,因为我收到了错误。

以下是错误所在:

//infix input is "1 + 2 * 3 - 4"
//tokens = {"1", "+", "2", "*", "3", "-", "4")
for(int i = 0; i < tokens.size(); i++)
{
    if(isOperand(tokens[i]))
        tempPostfix += tokens[i];
    else if(isOperator(tokens[i]))
    {
        if(st.empty())
            st.push(tokens[i]);
        else if(getWeight(tokens[i]) > getWeight(st.top()))
            st.push(tokens[i]);
        else
        {
            while(getWeight(tokens[i]) <= getWeight(st.top()) && !st.empty())
            {
                tempPostfix += st.top();
                st.pop(); //If there is only one item in the stack, it crashes
            }

            st.push(tokens[i]);
        }
    }

}
while(!st.empty())
{
    tempPostfix += st.top();
    st.pop();
}
string postfix = tempPostfix;
return postfix;

以下是我在其中调用的其他功能

bool isOperator(string s)
{
    bool r = false;
    if(s == "+" || s == "-" || s == "*" || s == "/")
        r = true;

    return r;
}

bool isOperand(string s)
{
    bool r = false;
    if(!isOperator(s) && s != "(" && s != ")")
        r = true;

    return r;
}

int getWeight(string op)
{
    int weight = 0;
    if(op == "+" || op == "-")
        weight = 1;
    if(op == "*" || op == "/")
        weight = 2;

    return weight;
}

一旦我弄清楚为什么我会在那里收到错误,我可以弄明白其余的。提前谢谢。

1 个答案:

答案 0 :(得分:0)

您应该更改while循环中的条件顺序。如你所说,当堆栈中只剩下一个项目时会出现错误。因此,在弹出堆栈中的最后一项后,再次评估while循环中的条件,并且当显然堆栈中没有剩余项目时,您尝试执行st.top()操作。

要解决此问题,您可以轻松地重新排序条件,以便首先放置此!st.empty()。这样就会出现短路,因此不会评估其余的条件。