C++中中缀符号的前缀

Posted

技术标签:

【中文标题】C++中中缀符号的前缀【英文标题】:prefix to infix notation in c++ 【发布时间】:2020-12-06 14:28:48 【问题描述】:

我正在尝试使用以下代码将前缀表达式转换为其中缀形式:

#include <iostream>
#include <stack>
 
using namespace std;
 
bool isOperand(char c)

    if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) 
        return true;
    
    else 
        return false;
    

 
string PrefixToInfix(string prefix)

    stack<string> s;
    for (int i = prefix.length() - 1; i >= 0; i--) 
        if (isOperand(prefix[i])) 
            string op(1, prefix[i]);
            s.push(op);
        
        else 
            string op1 = s.top();
            s.pop();
            string op2 = s.top();
            s.pop();
            s.push("(" + op1 + prefix[i] + op2 + ")");
        
    

    return s.top();

 
int main()

    string infix, prefix;
    cin >> prefix;
    infix = PrefixToInfix(prefix);
    cout << infix << endl;
 
    return 0;

它适用于表达式..*+abc+d+efg,输出是((((a+b)*c).(d+(e+f))).g) 和它的权利。当我输入+.*bbba+++b++bb*b+bb+bba 我得到(((b*b).b)+a) 但输出应该是((bb)*(ba)+(((b+((b+b)+b*))+(b+b))+(bb+a)))*。 有人可以帮我理解错误背后的原因吗?

【问题讨论】:

对于测试和调试,它有助于将最简单的失败输入硬编码到程序本身中。然后,您应该使用 调试器 逐个语句地执行代码语句,以监视变量及其值。 补充一下 Someprogrammerdude 所说的:从小得多的测试用例开始,到更长的测试用例,确保一次一个地尝试程序中的每条路径......换句话说,开始使用您知道工作并逐步构建的非常小但稳定的代码基础,以便您对每个结果充满信心。 ((bb)*(ba)+(((b+((b+b)+b*))+(b+b))+(bb+a)))* 是一个有效的中缀表达式吗? 中缀表达式中的bb 应该是什么?由于您的语法中没有名称分隔符,我假设变量只能是一个字符。 【参考方案1】:

我解决了问题,只是将prefixToInfix() 更改为:

string PrefixToInfix(string prefix)

    stack<string> s;
    for (int i = prefix.length() - 1; i >= 0; i--) 
        if (isOperand(prefix[i])) 
            string op(1, prefix[i]);
            s.push(op);
        
        else 
            if(prefix[i] == "*") 
              string op1 = s.top();
              s.pop();
              s.push("(" + op1 + prefix[i] + ")");
             else 
              string op1 = s.top();
              s.pop();
              string op2 = s.top();
              s.pop();
              s.push("(" + op1 + prefix[i] + op2 + ")");
            
        
    

    return s.top();

【讨论】:

以上是关于C++中中缀符号的前缀的主要内容,如果未能解决你的问题,请参考以下文章

前缀,后缀转中缀以及中缀转前缀,后缀

前缀,后缀转中缀以及中缀转前缀,后缀

在 Python 中为中缀表示法添加前缀表示法

中缀前缀后缀表达式的转换

在 JavaScript 中将中缀转换为前缀表示法

书写表达式:中缀、后缀和前缀