今天给各位分享c语言中缀转后缀栈的知识,其中也会对中缀表达式转前缀表达式栈进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
1、中缀表达式如何转换为前后缀表达式?2、利用栈把表达式的中缀表示转换成后缀表示C++3、用C语言实现中缀表达式到后缀表达式的转换 求改正!4、数据结构(使用C语言)问题
中缀表达式如何转换为前后缀表达式?
1、中缀表达式变后缀的算法:遇到操作数,直接输出。
2、栈为空是,遇到运算符,直接入栈。
3、遇到左括号时,将其入栈。
4、遇到右括号时,执行出栈操作,并且开始将出栈的元素输出。直到弹出栈的元素是左括号为止。
5、遇到其他运算符的时候,弹出所有优先级大于等于该运算符栈顶元素,然后将该运算符入栈。最终将栈中的元素依次出栈。
利用栈把表达式的中缀表示转换成后缀表示C++
#includestdio.h
struct
{
int op;
double num;
}ret[200];
int topa,topb;
int opstk[200];
int level[200];
double cal(double a,double b,char op)
{
if(op==’+’)
return a+b;
if(op==’-‘)
return a-b;
if(op==’*’)
return a*b;
if(op==’/’)
return a/b;
}
int main()
{
int i,temp,sign,j,x,y;
char s[200];
level[‘+’]=level[‘-‘]=0;
level[‘*’]=level[‘/’]=1;
level[‘(‘]=level[‘)’]=2;
while(scanf(“%s”,s)!=EOF)
{
topa=topb=0;
for(i=0;s[i];i++)
{
if(s[i]=='(‘)
{
opstk[topa++]='(‘;
}
else if(s[i]==’)’)
{
while(topa0opstk[topa-1]!='(‘)
{
topa–;
ret[topb++].op=opstk[topa];
}
topa–;
}
else if(s[i]==’+’||s[i]==’*’||s[i]==’/’)
{
while(topa0opstk[topa-1]!='(‘level[opstk[topa-1]]=level[s[i]])
{
topa–;
ret[topb++].op=opstk[topa];
}
opstk[topa++]=s[i];
}
else if(s[i]==’-‘)
{
if((i0s[i-1]=='(‘)||i==0)
{
sign=-1;
temp=0;
for(j=i+1;s[j]s[j]=’0’s[j]=’9′;j++)
temp=temp*10+s[j]-‘0’;
ret[topb].op=-1;
ret[topb++].num=sign*temp;
i=j-1;
}
else
{
while(topa0opstk[topa-1]!='(‘level[opstk[topa-1]]=level[‘-‘])
{
topa–;
ret[topb++].op=opstk[topa];
}
opstk[topa++]=’-‘;
}
}
else if(s[i]=’0’s[i]=’9′)
{
temp=0;
for(j=i;s[j]s[j]=’0’s[j]=’9′;j++)
temp=temp*10+s[j]-‘0’;
ret[topb].op=-1;
ret[topb++].num=temp;
i=j-1;
}
}
while(topa0)
{
topa–;
ret[topb++].op=opstk[topa];
}
for(i=0;itopb;i++)
{
if(ret[i].op==’+’||ret[i].op==’-‘||ret[i].op==’*’||ret[i].op==’/’)
{
for(y=i-1;y=0;y–)
if(ret[y].op==-1)
break;
for(x=y-1;x=0;x–)
if(ret[x].op==-1)
break;
ret[i].num=cal(ret[x].num,ret[y].num,ret[i].op);
ret[i].op=-1;
ret[x].op=0;
ret[y].op=0;
}
}
printf(“%.4lf\n”,ret[topb-1].num);
}
return 0;
}
用C语言实现中缀表达式到后缀表达式的转换 求改正!
main函数中:
printf(“%2c”,queueempty(q));
改为
printf(“%2c”,q-data[q-front++]);
测试:
1+2*3#
1 2 3 * +
数据结构(使用C语言)问题
首先得知道中缀转后缀的方法,那就是从左到右开始操作数直接输出,然后运算符进栈。。进栈时注意运算符的优先级,置于优先级自行看课本或者百度了解。
A*(B-D)+E/F
栈:*(-)
输出:ABD
此时,出现有括号,要将括号的运算符输出;
栈:*
输出:ABD-
因为+优先级小于*,因此*要输出,然后+进栈;
栈:+
输出:ABD-*E
因为/优先级大于+所以/进栈;
栈:+/
输出:ABD-*EF
左后输出栈中元素,注意,栈的出栈是FILO;
栈:
输出:ABD-*EF/+;
至于准确性,你可以用后缀转中缀的方式检验,就是在后缀表达式中从左到右开始,遇到运算符就提取他前面的两个操作数进行运算。
关于c语言中缀转后缀栈和中缀表达式转前缀表达式栈的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。