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

时间:2015-06-26 17:53:01

标签: c++ linked-list stack postfix-notation infix-notation

我目前正在开发一个项目,使用单个链接列表形式的堆栈将后缀转换为中缀。我设法将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 个答案:

答案 0 :(得分: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作为程序的字符串即可给出预期结果。

正如您在other question中提到的那样,忽略输入字符串中的空格会更好:您应该在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))

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

答案 1 :(得分:0)

我得到的印象是你的“堆栈”使用不当。例如如果ab + *被推入堆栈,则变量变为leftop = +rightop = bop = a,为了转换后缀表达式,最简单的方法是创建二进制求值树以获得运算符优先级右

e.g。

对于你想要的ab + c *

     *
    / \
   +   c
  / \
 a   b 

然后以递归方式评估树。每当操作符为+或 - 时,在其周围使用括号,