C++ 使用递归进行中缀到前缀的转换
我正在努力寻找中缀到前缀的转换方案 我已经计算了中缀到后缀的转换: 以及我的中缀到后缀转换代码,根据上述转换方案: 预期产出:C++ 使用递归进行中缀到前缀的转换,c++,compiler-construction,parse-tree,C++,Compiler Construction,Parse Tree,我正在努力寻找中缀到前缀的转换方案 我已经计算了中缀到后缀的转换: 以及我的中缀到后缀转换代码,根据上述转换方案: 预期产出: -9+52 我想用上面显示的中缀到后缀转换的相同结构来实现这一点。 就这些 最简单的解决方案是在解析时构造一个树,然后使用 例如,您也可以按照建议边走边构造字符串,但是: 这不是递归解决方案:,并且 它涉及大量的字符串复制,因此它可能有二次运行时间。 例如,将后缀转换为堆栈中的某种临时数据结构,然后通过打印前缀表达式递归地遍历后缀表示,这似乎也很诱人。这当然会起作用,
-9+52
我想用上面显示的中缀到后缀转换的相同结构来实现这一点。
就这些 最简单的解决方案是在解析时构造一个树,然后使用 例如,您也可以按照建议边走边构造字符串,但是: 这不是递归解决方案:,并且 它涉及大量的字符串复制,因此它可能有二次运行时间。 例如,将后缀转换为堆栈中的某种临时数据结构,然后通过打印前缀表达式递归地遍历后缀表示,这似乎也很诱人。这当然会起作用,但您会遇到这样的问题:以自然方式遍历后缀表示将首先访问每个表达式的右参数,而您首先需要的是左参数。这意味着您需要向后构造字符串,这涉及另一个临时数据结构,例如另一个堆栈
总的来说,AST解决方案更干净,为将来添加更多功能提供了良好的基础。因此我使用了一个时态变量来存储我的数字,并在保持顺序优先的情况下递归检查和打印运算符 我的解决方案:
#include<iostream>
using namespace std;
const char input[] = "9-5+2";
int index = 0;
char LookAhead = input[index];
char TempLookAhead = 'x';
void Match(char newChar);
void Factor();
void Rest_();
void Rest();
void Term();
void Expression();
int main(){
Expression();
return 0;
}
void Match(char newChar){
if(newChar == LookAhead){
index++;
LookAhead = input[index];
}
}
void Expression(){
Term();
Rest();
cout << TempLookAhead;
}
void Term(){
Factor();
Rest_();
}
void Rest(){
if(LookAhead == '+'){
cout << '+';
cout << TempLookAhead;
Match(LookAhead);
Term();
Rest();
}else if(LookAhead == '-'){
cout << '-';
cout << TempLookAhead;
Match(LookAhead);
Term();
Rest();
}else{
}
}
void Rest_(){
if(LookAhead == '*'){
cout << '*';
cout << TempLookAhead;
Match(LookAhead);
Factor();
Rest_();
}else if(LookAhead == '/'){
cout << '/';
cout << TempLookAhead;
Match(LookAhead);
Factor();
Rest_();
}else{
}
}
void Factor(){
if(isdigit(LookAhead)){
TempLookAhead = LookAhead;
Match(LookAhead);
}
}
您的代码是否按其应有的方式工作,而您只需要代码检查?然后再发布。如果它不起作用,那么您需要详细说明您的问题,比如向我们展示一些特定的输入、预期的和实际的输出,以及您试图调试问题的内容。如果你已经完成了,那么请花点时间来搜索反向波兰语notation@EdHeal你能详细说明一下吗that@Ray谷歌,谷歌。将中缀转换为后缀。可以找到算法来实现这一点我遵循了递归的方式,只是使用了一个临时存储的概念,并且在我想做的事情上取得了成功,请在这里回顾我的答案,谢谢你的帮助@雷:我想你已经用比9-5+2更复杂的表达式测试过了,对吧?我很难相信一个临时变量就足以存储整个未打印值堆栈。1*2+3*4是否正确输出+*12*34?我认为,您似乎没有解析括号这一事实限制了表达式的复杂性,但除非在需求中有明确说明,否则这似乎是一个巨大的遗漏。不管怎样,祝你好运。
9-5+2
-9+52
#include<iostream>
using namespace std;
const char input[] = "9-5+2";
int index = 0;
char LookAhead = input[index];
char TempLookAhead = 'x';
void Match(char newChar);
void Factor();
void Rest_();
void Rest();
void Term();
void Expression();
int main(){
Expression();
return 0;
}
void Match(char newChar){
if(newChar == LookAhead){
index++;
LookAhead = input[index];
}
}
void Expression(){
Term();
Rest();
cout << TempLookAhead;
}
void Term(){
Factor();
Rest_();
}
void Rest(){
if(LookAhead == '+'){
cout << '+';
cout << TempLookAhead;
Match(LookAhead);
Term();
Rest();
}else if(LookAhead == '-'){
cout << '-';
cout << TempLookAhead;
Match(LookAhead);
Term();
Rest();
}else{
}
}
void Rest_(){
if(LookAhead == '*'){
cout << '*';
cout << TempLookAhead;
Match(LookAhead);
Factor();
Rest_();
}else if(LookAhead == '/'){
cout << '/';
cout << TempLookAhead;
Match(LookAhead);
Factor();
Rest_();
}else{
}
}
void Factor(){
if(isdigit(LookAhead)){
TempLookAhead = LookAhead;
Match(LookAhead);
}
}