1

我做了一个InfixtoPostfix转换器,并认为它有效,但是当我回去向我的老师展示它时,他测试的一个例子结果是错误的。:|

如果有人能在这件事上帮助我,我将不胜感激,并让我知道出了什么问题。

我跳过了关于输入数字按钮的部分,只发布了其余部分,

    private void button20_Click(object sender, EventArgs e)
    {
        try
        {
            string infix = textBox1.Text;
            infixTopostfix obj = new infixTopostfix(infix);
            textBox1.Text = string.Empty;
            Console.WriteLine("{0} is the Postfix of  {1}", obj.createPrifex(), infix);

        }
        catch (Exception e1)
        {
            Console.WriteLine(e1.ToString());
        }
    }

上面的部分用于将 a 重定向console.writeline到我的文本框及其完成所有工作并给出最终结果的按钮。

这是主要课程:

class infixTopostfix
{
    public infixTopostfix(string strTemp)
    {
        strInput = strTemp;
    }

    private int isOperand(char chrTemp)
    {
        char[] op = new char[6] { '*', '/', '+', '-', '^', '(' };
        foreach (char chr in op)
            if (chr == chrTemp)
            {
                return 1;
            }
        return 0;
    }
    private int isOperator(char chrTemp)
    {
        char[] op = new char[5] { '*', '/', '+', '-', '^' };
        foreach (char chr in op)
            if (chr == chrTemp)
            {
                return 1;
            }
        return 0;
    }

    private string strResualt = null;
    private string strInput = null;
    public string createPrifex()
    {
        int intCheck = 0;
        //int intStackCount = 0;
        object objStck = null;
        for (int intNextToken = 0; intNextToken <= strInput.Length - 1; intNextToken++)
        {
            intCheck = isOperand(strInput[intNextToken]);
            if (intCheck == 1)
                stkOperatore.Push(strInput[intNextToken]);
            else
                if (strInput[intNextToken] == ')')
                {
                    int c = stkOperatore.Count;
                    for (int intStackCount = 0; intStackCount <= c - 1; intStackCount++)
                    {
                        objStck = stkOperatore.Pop();
                        intCheck = isOperator(char.Parse(objStck.ToString()));
                        if (intCheck == 1)
                        {
                            strResualt += objStck.ToString();
                        }
                    }
                }
                else
                    strResualt += strInput[intNextToken];

        }//end of for(int intNextToken...)
        int intCount = stkOperatore.Count;
        if (intCount > 0)
        {
            int c = stkOperatore.Count;
            for (int intStackCount = 0; intStackCount <= c - 1; intStackCount++)
            {
                objStck = stkOperatore.Pop();
                intCheck = isOperator(char.Parse(objStck.ToString()));
                if (intCheck == 1)
                {
                    strResualt += Convert.ToString(objStck);
                }
            }
        }

        return strResualt;
    }

    private System.Collections.Stack stkOperatore = new System.Collections.Stack();

}

}

这是失败的输入:

A^B^(CD/(E+F))-(G+H)^L*Z+Y

此代码的结果不正确:

ABCDEF+/-^^GH+-LZY+*^

正确的结果:

ABCDEF+/-^^GH+L^Z*-Y+

4

1 回答 1

1

将中缀表示法转换为后缀表示法(AKA反向波兰表示法)时,必须考虑运算符优先级运算符关联性。这些通常以表格的形式实现,并根据操作符字符在表格中查找。

例如
Java
C#
C++

因为我没有在您的代码中看到任何提及优先级或关联性的内容;所以我会说你的代码没有错误,但算法无效。

将中缀转换为后缀的经典算法是 Edsger Dijkstra 的shutting yard算法,它可能是最接近您尝试实现的方法。

我建议你用笔写一篇论文来理解分流算法,然后使用许多测试用例来实现算法,这些测试用例逐渐使用更多的运算符组合。

我所知道的最好的解释是调车场算法

如果你用谷歌搜索 C# shutting yard,你会发现很多实现,只要确保你使用的一个是正确的。很多人喜欢发布这样的例子,但经常出错。在浪费时间之前验证它们是否适用于许多测试用例。

于 2013-12-14T19:59:29.413 回答