C++ 中缀到后缀表达式转换代码不工作
以下是我在cpp中将中缀转换为后缀表达式的代码?我已经尝试了一切,但我的代码没有给我想要的结果?请有人帮帮我…plzzzz 虽然我认为代码是正确的,但它不起作用。我花了很多时间检查这段代码,并检查了evry line的工作情况,但它仍然不工作C++ 中缀到后缀表达式转换代码不工作,c++,C++,以下是我在cpp中将中缀转换为后缀表达式的代码?我已经尝试了一切,但我的代码没有给我想要的结果?请有人帮帮我…plzzzz 虽然我认为代码是正确的,但它不起作用。我花了很多时间检查这段代码,并检查了evry line的工作情况,但它仍然不工作 #include <iostream> #include<conio.h> using namespace std; int k=-1,m=0; int j=0; string infi,postfi,operato; int p
#include <iostream>
#include<conio.h>
using namespace std;
int k=-1,m=0;
int j=0;
string infi,postfi,operato;
int precedence(char s)
{
switch(s)
{
case '+':
case '-':
return 1;
break;
case '*':
case '/':
return 2;
break;
case '$':
return 3;
break;
case '(':
return 4;
break;
case ')':
return 5;
break;
}
}
void operat()
{
if(k==-1)
{
k++;
operato[k]=infi[j];
//cout<<operato[0]<<"mm";
}
else if(precedence(infi[j])==4)
{
//cout<<"0000";
k++;
operato[k]=infi[j];
}
else if(precedence(infi[j])==5)
{
//cout<<"0000";
while(operato[k]!='(')
{
postfi[m]=operato[k];
m++;
k--;
}
k--;
}
else if(precedence(infi[j])>precedence(operato[k]))
{
//cout<<"0000";
k++;
operato[k]=infi[j];
}
else
{
//cout<<"0000";
postfi[m]=operato[k];
k--;
m++;
operat();
}
//cout<<postfi[0]<<"pp";
}
int main()
{
cin>>infi;
while(infi[j]!='\0')
{
if(infi[j]=='+'||infi[j]=='-'||infi[j]=='*'||infi[j]=='/'||infi[j]=='('||infi[j]==')'||infi[j]=='$')
{
operat();
j++;
}
else
{
postfi[m]=infi[j];
//cout<<postfi[0];
//cout<<"me"<<m<<postfi[m];
m++;
j++;
}
}
while(k!=-1)
{
postfi[m]=operato[k];
//cout<<postfi[0];
//cout<<"me"<<m;
//cout<<"meow"<<m<<postfi[m];
k--;
m++;
}
//cout<<postfi[0];
int g;
for(g=0;g<m;g++)
cout<<postfi[g];
//getch();
return(0);
}
#包括
#包括
使用名称空间std;
int k=-1,m=0;
int j=0;
字符串infi、postfi、operato;
整数优先级(字符s)
{
开关
{
格“+”:
案例'-':
返回1;
打破
案例“*”:
案例“/”:
返回2;
打破
案例“$”:
返回3;
打破
格“(”:
返回4;
打破
案例“)”:
返回5;
打破
}
}
无效运算符()
{
如果(k==-1)
{
k++;
运算符[k]=infi[j];
//cout我尽可能保留你发布的内容的原始内容,这样你就可以关注它。根据需要修改它,我没有优化,我没有使用STL(因为我假设这是作业,因为你没有使用STL),我写它是为了让它功能正常。正如我所说的,你必须使用它来获得你想要的优先权,但它是功能性的,正如我所说的。而且我假设它是家庭作业:我也没有完成它,只是希望把你带向正确的方向
#include <iostream>
#include<conio.h>
using namespace std;
int precedence(char s)
{
int rVal = -1; //Let's assume we didn't succeed
switch(s)
{
case '+':
rVal = 7;
break;
case '-':
rVal = 6;
break;
case '*':
rVal = 5;
break;
case '/':
rVal = 4;
break;
case '^':
rVal = 3;
break;
case '(':
rVal = 2;
break;
case ')':
rVal = 1;
break;
default:
break;
}
return rVal; //This satisfies the warning
}
char getpres(int num)
{
char rVal = 0;
switch(num)
{
case 7:
rVal = '+';
break;
case 6:
rVal = '-';
break;
case 5:
rVal = '*';
break;
case 4:
rVal = '/';
break;
case 3:
rVal = '^';
break;
case 2:
rVal = '(';
break;
case 1:
rVal = ')';
break;
default:
break;
}
return rVal; //This satisfies the warning
}
string reorder(string temp)
{
string rVal = "\0";
int *array = new int[temp.length()];
unsigned int d = 0;
for(unsigned int x = 0; x <= temp.length(); ++x )
{
array[x] = precedence(temp[x]);
}
for(unsigned int i = 0;i< temp.length() +1;i++)
{
for(unsigned int j = 1;j<i;j++)
{
if(array[i] > array[j])
{
d = array[i]; //swap
array[i]=array[j];
array[j]=d;
}
}
}
d = 0;
for(; d < temp.length(); ++d)
{
rVal += getpres(array[d]);
}
return rVal;
}
int main()
{
int itr=0;
string infi = "" ,postfi = "" ,operato = "";
std::cin>>infi;
while(itr <= infi.length())
{
if(precedence(infi[itr]) > -1)
{
operato += infi[itr];
}
else
{
postfi += infi[itr];
}
++itr;
}
postfi += reorder(operato);
std::cout<<postfi<<std::endl;
return 0;
}
#包括
#包括
使用名称空间std;
整数优先级(字符s)
{
int rVal=-1;//假设我们没有成功
开关
{
格“+”:
rVal=7;
打破
案例'-':
rVal=6;
打破
案例“*”:
rVal=5;
打破
案例“/”:
rVal=4;
打破
案例‘^’:
rVal=3;
打破
格“(”:
rVal=2;
打破
案例“)”:
rVal=1;
打破
违约:
打破
}
return rVal;//这满足警告
}
char getpres(int num)
{
char rVal=0;
开关(num)
{
案例7:
rVal='+';
打破
案例6:
rVal='-';
打破
案例5:
rVal='*';
打破
案例4:
rVal='/';
打破
案例3:
rVal='^';
打破
案例2:
rVal='(';
打破
案例1:
rVal=')';
打破
违约:
打破
}
return rVal;//这满足警告
}
字符串重新排序(字符串临时)
{
字符串rVal=“\0”;
int*array=newint[temp.length()];
无符号整数d=0;
对于(无符号整数x=0;x>infi;
while(itr-1)
{
运算符+=infi[itr];
}
其他的
{
postfi+=infi[itr];
}
++itr;
}
postfi+=重新订购(操作);
coutGeneral建议,试着使用一个调试器,你可以一行一行地调试代码并设置断点来查看发生了什么。事实上,我试过这样做,但我看不出来,即使在检查测试用例a+b时,它给出的是+b+,而不是正确的答案,即ab+,我只是不明白为什么它这样做…:(它应该输出什么?这里的总体目标是什么?它应该将中缀表达式转换为后缀表达式,即求值顺序,例如,如果输入是a+b*c,那么输出将是abc*+对不起,我无法理解您在做什么,因为它与我使用的逻辑非常不同(我可能错了)但是我真的不明白…还有一件事,你能告诉我我的代码有什么错误吗?因为对我来说,我的代码应该可以工作,但它不工作。如果可以,请帮助我…谢谢你花时间写代码…:)我最后解决的是在你的switch语句中,当你发现某些字符时,你缺少控制出口。全局变量在非常奇怪的条件下被修改。过多的循环(特别是在末尾打印字符串的循环)。infi[j]!='\0'
从未找到'\0',所以它会崩溃(对我来说).除此之外,我还添加了另外一件事,就是仔细检查您解析字符串的逻辑和其他一些次要的东西(哦,还有一个冒泡排序,用于操作优先顺序)