在文本文件中查找中缀表达式的后缀形式

Posted

技术标签:

【中文标题】在文本文件中查找中缀表达式的后缀形式【英文标题】:Finding postfix form of infix expressions in a text file 【发布时间】:2020-04-22 20:51:11 【问题描述】:

我正在尝试查找中缀表达式的后缀形式。我的程序应该在给定的文本文件中读取并计算它。该程序读取文件并向我显示中缀形式,但它不计算中缀表达式的后缀形式。我无法理解问题出在哪里。我的意思是,我不知道问题出在 main() 函数还是 convertToPostfix 函数中。我应该怎么做才能解决这个问题?

主要功能:

int main() 

    infixToPostfix<string> exp;
    string getcontent;

    ifstream infile;

    infile.open("infixData.txt");
    if (infile.is_open()) 
        while (!infile.eof()) 
            exp.showInfix();
            infile >> getcontent;
            cout << getcontent << endl;
            exp.convertToPostfix();
            exp.getPfx();
            exp.showPostfix();


        

    
    return 0;

还有converToPostfix()函数:

template <class Type>
void infixToPostfix<Type>::convertToPostfix() 


stackType<string> obj;
stackType<char> x;
    int i = 0, j=0;
    while (infx[i] != '\0')
    
        if ((infx[i] >= 'a' && infx[i] <= 'z') || (infx[i] >= 'A' && infx[i] <= 'Z')) 
            pfx[j] += infx[i];
        
        else if (infx[i] == '(')
            obj.push("(");
    
        else if (infx[i] == ')') 
            while (obj.top() != "(")
            
                pfx += obj.top();
                obj.pop();
            
            if (obj.top() == "(")
                obj.pop();
        
        else
            while (precedence(x.top(), infx[i]))
            
                pfx += obj.top();
                obj.pop();
                j++;
            
            obj.push(infx);

        
        i++;
    
    cout << pfx << endl;


我的“infixData.txt”文件:

A+B-C;
(A+B)*C;
(A+B)*(C-D);
A+((B+C)*(E-F)-G)/(H-I);
A+B*(C+D)-E/F*G+H;
2+4-1;
(6+3)*2;

showInfix():

template <class Type>
void infixToPostfix<Type>::showInfix()

    cout << endl;
    cout << "Infix expression: " << infx;


【问题讨论】:

当然主要功能很奇怪。您似乎正在将中缀表达式读入一个名为getcontent 的变量中,对吗?但是您的convertToPostfix 例程在一个名为infx 的变量上运行,并且没有给出如何设置的线索。需要更多代码。以及有关文件 infixData.txt 中内容的详细信息。 然后有一个奇怪的方法showInfix 没有给出关于它可能在做什么的线索。总体而言,代码看起来杂乱无章且晦涩难懂,但没有足够的信息来准确诊断问题所在。 【参考方案1】:

所以这似乎是代码组织的问题。您根本没有以可能的方式使用程序中的变量。您正在将文件读入一个变量,但使用完全不同的变量来尝试解决问题。

这是你应该做的,将中缀表达式读入 main 中的一个变量,然后你将该变量作为参数传递给计算后缀表达式的函数。像这样

        infile >> getcontent;
        cout << getcontent << endl;
        convertToPostfix(getcontext);

那么convertToPostfix应该是这样的函数

void convertToPostfix(const std::string& infx) 
    ...

不需要有一个名为infixToPostfix的类,只需编写函数来完成工作,而不是类。

你真的需要阅读,如何编写函数,如何将参数传递给函数以及从函数返回值。这是一个非常基本的技能。目前你显然不理解它,但你理解它绝对是至关重要的。

您的代码还包含许多高级功能,例如类和模板,这些对于此任务是不必要的,并且在您尚未掌握基础知识时无论如何都不应该使用。

我猜你是从某个地方复制了convertToPostfix 函数。您应该意识到它并不能完全解决您遇到的问题。它处理的字符串格式与您拥有的字符串格式略有不同。不知道你能看出区别吗?

【讨论】:

以上是关于在文本文件中查找中缀表达式的后缀形式的主要内容,如果未能解决你的问题,请参考以下文章

什么是中缀表达式与后缀表达式

中缀表达式转为后缀表达式(逆波兰式)求值

中缀表达式转为后缀表达式(逆波兰式)求值

前缀表达式中缀表达式和后缀表达式

算术表达式的前缀,中缀,后缀相互转换

中缀表达式转换为后缀表达式(1042)