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++中中缀符号的前缀的主要内容,如果未能解决你的问题,请参考以下文章