Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用递归进行中缀到前缀的转换_C++_Compiler Construction_Parse Tree - Fatal编程技术网

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);
    }
}