C语言实现中缀后缀前缀表达式相互转化并求值文档格式.docx

上传人:b****4 文档编号:17946978 上传时间:2022-12-12 格式:DOCX 页数:18 大小:265.81KB
下载 相关 举报
C语言实现中缀后缀前缀表达式相互转化并求值文档格式.docx_第1页
第1页 / 共18页
C语言实现中缀后缀前缀表达式相互转化并求值文档格式.docx_第2页
第2页 / 共18页
C语言实现中缀后缀前缀表达式相互转化并求值文档格式.docx_第3页
第3页 / 共18页
C语言实现中缀后缀前缀表达式相互转化并求值文档格式.docx_第4页
第4页 / 共18页
C语言实现中缀后缀前缀表达式相互转化并求值文档格式.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

C语言实现中缀后缀前缀表达式相互转化并求值文档格式.docx

《C语言实现中缀后缀前缀表达式相互转化并求值文档格式.docx》由会员分享,可在线阅读,更多相关《C语言实现中缀后缀前缀表达式相互转化并求值文档格式.docx(18页珍藏版)》请在冰豆网上搜索。

C语言实现中缀后缀前缀表达式相互转化并求值文档格式.docx

图1.4

(3)按“2”选择中缀表达式转变为后缀表达式并求值,如图1.5所示。

图1.5

(4)按“3”选择中缀表达式转变为前缀表达式并求值,如图1.6所示。

图1.6

附录:

源代码

#include<

stdio.h>

stdlib.h>

#defineMAXNUM100

typedefintselemtype1;

//定义运算数栈的结点

typedefstruct//定义运算数栈的类型

{selemtype1*base;

selemtype1*top;

}sqstack1;

voidInitStack1(sqstack1&

s)//新建一个空运算数栈

{s.base=(selemtype1*)malloc(MAXNUM*sizeof(selemtype1));

s.top=s.base;

if(!

s.base)printf("

出错:

申请空间失败!

\n"

);

}

voidPush1(sqstack1&

s,selemtype1&

e)//运算数栈,入栈:

插入元素e为新的栈顶元素

{if(s.top-s.base>

=MAXNUM)

printf("

表达式过长!

1\n"

*s.top++=e;

}

voidGetTop1(sqstack1s,selemtype1&

e)//运算数栈,用e返回栈顶元素

{e=*(s.top-1);

voidPopopnd1(sqstack1&

e)//运算数栈,退栈:

删除栈顶元素,并用e返回其值

{e=*--s.top;

intstackempy1(sqstack1s)//运算数栈,若为空栈返回1,否则返回0

{if(s.top==s.base)return1;

elsereturn0;

 

typedefcharselemtype2;

//定义运算符栈的结点类型

typedefstruct//定义运算符栈类型

{selemtype2*base;

selemtype2*top;

}sqstack2;

voidInitStack2(sqstack2&

s)//新建一个空运算符栈

{s.base=(selemtype2*)malloc(MAXNUM*sizeof(selemtype2));

voidPush2(sqstack2&

s,selemtype2&

e)//运算符栈,入栈:

2\n"

voidGetTop2(sqstack2s,selemtype2&

e)//运算符栈,用e返回栈顶元素

voidPopopnd2(sqstack2&

e)//运算符栈,退栈:

intstackempy2(sqstack2s)//运算符栈,若为空栈返回1,否则返回0

voidpriority(charc,int&

i)//确定运算符优先级

{if(c=='

*'

||c=='

/'

%'

)i=2;

elseif(c=='

+'

-'

)i=1;

elsei=0;

intcompare(chara,charb)//比较栈顶元素运算符与外部运算符优先级大小,外部优先级大则返回1,反之返回0

{intin,out;

priority(a,in);

priority(b,out);

if(out>

in)return1;

voidOperat(sqstack1&

OPND,sqstack2&

OPTR)

{intnum1,num2,num;

charc;

Popopnd1(OPND,num2);

Popopnd1(OPND,num1);

Popopnd2(OPTR,c);

switch(c)

{case'

:

num=num1+num2;

break;

case'

num=num1-num2;

num=num1*num2;

num=num1/num2;

num=num1%num2;

}

Push1(OPND,num);

voidOperatqianzhui(sqstack1&

voidhouzhuiqiuzhi(Lnode*p,int&

e)//后缀表达式求值

{sqstack1OPND;

//运算数栈

sqstack2OPTR;

//运算符栈

intn;

p=p->

next;

InitStack1(OPND);

InitStack2(OPTR);

while(p)

{switch(p->

data)

{case1:

n=p->

data1;

Push1(OPND,n);

break;

case2:

c=p->

data2;

Push2(OPTR,c);

Operat(OPND,OPTR);

default:

printf("

结点有误"

Popopnd1(OPND,n);

e=n;

voidzhongzhui(Lnode*p)//中缀表达式求值

charc,c2;

Lnode*first;

first=p;

while(!

stackempy2(OPTR)||p)

{while(p)

if(stackempy2(OPTR))Push2(OPTR,c);

else{switch(c)

('

Push2(OPTR,c);

)'

GetTop2(OPTR,c2);

while(c2!

='

{Operat(OPND,OPTR);

Popopnd2(OPTR,c2);

if(compare(c2,c))Push2(OPTR,c);

else{Operat(OPND,OPTR);

stackempy2(OPTR))

Operat(OPND,OPTR);

Popopnd1(OPND,n);

p=first->

{if(p->

data==1)printf("

%d"

p->

data1);

if(p->

data==2)printf("

%c"

data2);

=%d"

n);

voidhouzhui(Lnode*p)//中缀表达式转化为后缀表达式

{sqstack2OPTR;

Lnode*r,*q,*head;

q=(Lnode*)malloc(sizeof(structNode));

head=q;

{switch(p->

r=(Lnode*)malloc(sizeof(structNode));

q->

next=r;

q=q->

data=1;

data1=n;

{case'

{r=(Lnode*)malloc(sizeof(structNode));

data=2;

data2=c2;

compare(c2,c))

{Popopnd2(OPTR,c2);

}

break;

next=NULL;

q=head->

while(q)

{if(q->

q->

if(q->

houzhuiqiuzhi(head,n);

voidqianzhuiqiuzhi(Lnode2*p,int&

e)//前缀表达式求值

Lnode2*head;

head=p;

while(p!

=head)

Operatqianzhui(OPND,OPTR);

voidqianzhui(Lnode*p)//中缀表达式转化为前缀表达式

Lnode2*q,*head,*r,*head2,*s;

q=(Lnode2*)malloc(sizeof(structNode2));

//建立存中缀表达式的双向循环链表

{r=(Lnode2*)malloc(sizeof(structNode2));

r->

prior=q;

data=p->

data;

data1=p->

data2=p->

next=head;

head->

s=(Lnode2*)malloc(sizeof(structNode2));

//建立存前缀表达式的双向循环链表

head2=s;

while(q!

{switch(q->

n=q->

r=(Lnode2*)malloc(sizeof(structNode2));

s->

prior=s;

s=s->

c=q->

else

{GetTop2(OPTR,c2);

if(c2=='

)Push2(OPTR,c);

else{switch(c)

{case'

Push2(OPTR,c);

{r=(Lnode2*)malloc(sizeof(structNode2));

prior;

next=head2;

head2->

while(s!

=head2)

{if(s->

s->

if(s->

qianzhuiqiuzhi(head2,n);

intmain()

{charn[10];

inti,j,k,a,b,z,y,e;

Lnode*p,*q,*first;

i=0;

e=1;

a=0;

b=1;

z=0;

y=0;

p=(Lnode*)malloc(sizeof(structNode));

请输入中缀表达式"

do

{c=getchar();

if('

0'

<

=c&

&

c<

9'

{n[i]=c;

i++;

{switch(c)

\n'

{if(n[0]>

'

n[0]<

{q=(Lnode*)malloc(sizeof(structNode));

p->

next=q;

for(k=0;

k<

i;

k++)

{for(j=0;

j<

=i-k-2;

j++)

e=e*10;

a=a+(n[k]-'

)*e;

e=1;

n[k]='

;

}

data1=a;

i=0;

if(c!

{if(p->

data==2)

data2!

c!

b=0;

data2=c;

if(c=='

)z++;

)y++;

}while(c!

='

if(z!

=y)b=0;

p->

if(b==0)

输入中缀表达式有误"

else

{printf("

输入1中缀表达式求值,输入2后缀表达式求值,输入3前缀表达式求值"

scanf("

%d"

&

b);

if(b==1)zhongzhui(first);

if(b==2)houzhui(first);

if(b==3)qianzhui(first);

return1;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1