[英]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 = b
, op = a
,为了转换后缀表达式,最简单的方法是创建一个二进制求值树以使运算符优先级正确
例如
您想要的ab + c *
*
/ \
+ c
/ \
a b
然后递归或不递归地评估树。 每当运算符为+或-时,请使用括号括起来,
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.