繁体   English   中英

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

[英]Converting from Infix to Postfix using stacks (c++)

我目前正在一个项目中,该项目使用堆栈以单链列表的形式从后缀转换为中缀。 我设法将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;
}

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

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

using namespace std;

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

您没有按正确的顺序从堆栈中取出元素:它是第一个op ,下一个rightop ,最后是leftop

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

expression循环太远了:应该是for (int i =0; i<expression.length();i++) (注意<而不是<=

完成此操作后,足以使convert函数以字符串的形式返回最后一个post ,以使程序产生预期的结果。

正如您在另一个问题中所提出的那样 ,最好忽略输入字符串中的空格:您应该添加if (isspace(expression[i])) continue; 立即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))

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

我得到的印象是您的“堆栈”未正确使用。 例如,如果将ab + *压入堆栈,则变量变为leftop = +rightop = bop = a ,为了转换后缀表达式,最简单的方法是创建一个二进制求值树以使运算符优先级正确

例如

您想要的ab + c *

     *
    / \
   +   c
  / \
 a   b 

然后递归或不递归地评估树。 每当运算符为+或-时,请使用括号括起来,

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM