我目前正在开发一个项目,使用单个链接列表形式的堆栈将后缀转换为中缀。我设法将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;
}
答案 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 = b
,op = a
,为了转换后缀表达式,最简单的方法是创建二进制求值树以获得运算符优先级右
e.g。
对于你想要的ab + c *
*
/ \
+ c
/ \
a b
然后以递归方式评估树。每当操作符为+或 - 时,在其周围使用括号,