我目前正在进行一个项目,使用单链表形式的堆栈将后缀转换为内缀。我已经设法将表达式,如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;
}
我得到的印象是你的“堆栈”没有正确使用。e、 g.如果将ab*推到堆栈上,则变量变为leftop=
,rightop=b
,op=a
,为了转换后缀表达式,最简单的方法是创建一个二元求值树以获得正确的运算符优先级
例如
对于ab c*你想要的
*
/ \
+ c
/ \
a b
然后递归或不递归地计算树。每次运算符在它周围使用括号,
原始代码缺少以下要编译的声明:
#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;