当前位置: 首页 > 知识库问答 >
问题:

使用堆栈从Infix转换为Postfix(c)

堵乐
2023-03-14

我目前正在进行一个项目,使用单链表形式的堆栈将后缀转换为内缀。我已经设法将表达式,如ab转换为(a b),但是当表达式变得更长时,如ab cd*-。它不工作。我正在考虑将之前转换的表达式推回到堆栈上,但是堆栈的类型是char,表达式是一个字符串,当我试图将其推回时,它会抱怨。我应该把它作为一个模板吗?如果是的话,我该怎么做?或者还有别的方法来解决这个问题吗?

这是我的密码:

#include "stack.h"

void convert(string expression){
    stack c;
    string post = " ";
    string rightop = "";
    string leftop = "";
    string op = "";

    for (int i = 0; i <= expression.length(); i++){
        c.push(expression[i]);
        c.print();
        if (expression[i] == '*' ||
            expression[i] == '+' ||
            expression[i] == '-' ||
            expression[i] == '/'){
            cout << c.top() << endl;
            leftop = c.top();
            cout << leftop << endl;

            c.pop();

            rightop = c.top();
            cout << rightop << endl;
            c.pop();
            op = c.top();
            cout << op << endl;
            //c.pop();
            post = "(" + leftop + " " + op + " " + rightop + ")";

            cout << post << endl;
        }
        //c.push(post);
    }
}


int main(){   
    string expression;
    cout << " Enter a Post Fix expression: ";    
    getline(cin, expression);    
    convert(expression);    
    return 0;
}

共有2个答案

董哲
2023-03-14

我得到的印象是你的“堆栈”没有正确使用。e、 g.如果将ab*推到堆栈上,则变量变为leftop=rightop=bop=a,为了转换后缀表达式,最简单的方法是创建一个二元求值树以获得正确的运算符优先级

例如

对于ab c*你想要的

     *
    / \
   +   c
  / \
 a   b 

然后递归或不递归地计算树。每次运算符在它周围使用括号,

屈星腾
2023-03-14

原始代码缺少以下要编译的声明:

#include "stack"
#include "string"
#include "iostream"

using namespace std;

接下来,堆栈的类型应该是一个字符串,以便能够在其中存储完整的表达式。

您没有按照正确的顺序从堆栈中获取元素:它首先是op,然后是右上角,最后是leftop

当前注释掉的最后一个c.pop()是从堆栈中删除第三个元素所必需的,但是它必须在循环内部跟随(再次注释掉)c.push(post);

表达式上的循环走得太远了:它应该是(int i=0; i

完成此操作后,就足以使convert函数将最后一个post作为字符串返回,以便程序给出预期结果。

正如您在另一个问题中所问的那样,忽略输入字符串中的空格会好得多:您应该在之后立即添加if(isspace(表达式[i]));for

通过所有这些修复,代码可能是:

#include <stack>
#include <string>
#include <iostream>
#include <cctypes>

using namespace std;

string convert(string expression){

    stack<string> c;

    string post =" ";
    string rightop="";
    string leftop="";
    string op ="";

    for (int i =0; i<expression.length();i++){
        if (isspace(expression[i])) continue;
        c.push(string(expression.c_str() + i, 1));
        //c.print();
        if(expression[i] == '*' ||
            expression[i] == '+' ||
            expression[i] == '-' ||
            expression[i] == '/'){
                cout<<c.top()<<endl;
                op=c.top();
                cout<<leftop<<endl;

                c.pop();


                rightop=c.top();
                cout<<rightop<<endl;
                c.pop();
                leftop=c.top();
                cout<<op<<endl;
                c.pop();
                post="(" + leftop + " " + op + " " + rightop + ")";

                cout<<post<<endl;
                c.push(post);
        }
    }
    return post;
}

int main(){

    string expression;
    cout<<" Enter a Post Fix expression: ";

    getline(cin,expression);

    string converted = convert(expression);

    cout << "Converted expression : " << converted << endl;

    return 0;
}

当给定ab cd*-时,你会在末尾得到((a b)-(c*d))

你只需要注释掉所有的跟踪表单转换方法;-)

 类似资料:
  • 最近,我浏览了一些网站,将中缀转换成前缀符号,最后我被卷了起来。 我已经给出了我所做的步骤。。 例:-(1(2*3))(5*6)(7/8) 方法1:-(无需任何算法的手动转换):- 方法2:- 根据现场情况http://scanftree.com/Data_Structure/infix-to-prefix 所以,在这里我完全被绞死了。 请任何人提供以下方面的信息:- 关于我在以上2种方法中哪里出

  • 我有一个包含n个元素的队列,前面是。我需要创建一个堆栈,上面有。 它只能通过排队、退队、推送和弹出以及持续存储来完成。与其说我需要一个答案,不如说我需要一个如何解决这个问题的想法。 请不要为我回答这个问题,但是请试着理解我是编程新手,我可以用一个想法来解决这个问题。 这是一种类似河内塔楼的方式吗 这只需要一个恒定的存储空间吗 这不是家庭作业,我只是需要一些关于如何进行的建议。我的第一个想法是,倒转

  • 我的讲师给了我一个任务,让我创建一个程序,使用堆栈将表达式和中缀转换为后缀。我制作了堆栈类和一些函数来读取中缀表达式。 但是这个函数,叫做,它负责使用堆栈将数组inFix中的inFix表达式转换为数组postFix中的postfix表达式,并没有做它应该做的事情...你们能帮帮我告诉我哪里做错了吗? 下面是从中缀转换为后缀的函数的代码,是我需要帮助修复的代码: 注意:convertToPostfi

  • 我有一个在AWS中托管的网站,它使用了许多AWS服务。该环境是使用web控制台和AWS CLI的组合手动创建的。我想开始使用CloudFormation来管理它。我使用了CouldFormer工具来创建堆栈的模板,但我找不到一种方法来使用它来管理现有的环境。它将允许我创建一个没有太多问题的重复环境,但我真的不想删除整个生产环境,这样我就可以使用CloudFormation重新创建它。 有没有办法创

  • 代码简介:我必须创建一个类来计算前缀、后缀或中缀表达式。它必须确定它是否是pre/post/infix,并将它们转换为后缀,例如,在从“/x7”转换为“x7/”的代码中,表达式在方法中从“x7/”编辑为“x7/”。这两种方法都很好,在多个示例上进行了测试(没有在这里发布完整的代码和作业,但也不需要它们。所问的问题只是我遇到的一个错误,不要担心,我不是在要求解决我的作业)。还有方法,因为可以有变量,

  • 问题描述 (Problem Description) 如何将中缀表达式转换为后缀表达式? 解决方案 (Solution) 下面的示例演示如何使用stack的概念将中缀转换为后缀表达式。 import java.io.IOException; public class InToPost { private Stack theStack; private String input;