中缀表达式转逆波兰式并求值.docx
- 文档编号:28798318
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:11
- 大小:16.08KB
中缀表达式转逆波兰式并求值.docx
《中缀表达式转逆波兰式并求值.docx》由会员分享,可在线阅读,更多相关《中缀表达式转逆波兰式并求值.docx(11页珍藏版)》请在冰豆网上搜索。
中缀表达式转逆波兰式并求值
中缀表达式转逆波兰式并求值
//标题:
栈的应用——中缀表达式转逆波兰式//时间:
2015年4月14日//所有者:
Vae
#include
#include
#include
#include
#include
#defineSTACK_INIT_SIZE100#defineSTACKCREATE10#defineOK1
#defineERROR0
typedefstructdouble_stack{
int*num;
int*index;
}DOUBLESTACK;
typedefstructSqStack
{
DOUBLESTACKtop;DOUBLESTACKbase;
intstacksize;
}SqStack;
//函数名:
InitStack//形参类型:
SqStack*//函数功能构造一个栈
voidInitStack(SqStack*S){
S->base.index=(int*)malloc(sizeof(int)*STACK_INIT_SIZE);
S->base.num=(int*)malloc(sizeof(int)*STACK_INIT_SIZE);
if(!
(S->base.num&&S->base.index))
{
printf("构造栈失败!
\n");
exit(-1);
}
S->top.num=S->base.num;
S->top.index=S->base.index;
S->stacksize=STACK_INIT_SIZE;
return;
}
//函数名:
Push
//形参类型:
SqStack*,int,int//函数功能插入e为新的栈顶元素
intPush(SqStack*S,intm,intn)
{
if((S->top.num-S->base.num)>=S->stacksize)
{
S->base.index=(int*)realloc(S->base.index,sizeof(int)*(STACK_INIT_SIZE+STACKCREATE));
S->base.num=(int*)realloc(S->base.num,sizeof(int)*(STACK_INIT_SIZE+STACKCREATE));
if(!
(S->base.num||S->base.index))
returnERROR;}
*S->top.index++=n;
*S->top.num++=m;
S->stacksize=S->stacksize+STACKCREATE;
returnOK;
}
//函数名:
Pop
//形参类型:
SqStack*,int*,int*//函数功能出栈并用e返回
intPop(SqStack*S,int*a,int*b){
if(S->base.num==S->top.num)returnERROR;
*a=*--S->top.num;
*b=*--S->top.index;
returnOK;
}
//函数名:
GetTop
//形参类型:
SqStack*,int*//函数功能用e返回栈顶元素
intGetTop(SqStackS,int*e){
if(S.top.num==S.base.num)
returnERROR;
*e=*(S.top.num-1);
returnOK;
}
//函数名:
EmptyStack//形参类型:
SqStack
//函数功能判断是否为空栈
intEmptyStack(SqStackS){
if(S.base.num==S.top.num)
returnOK;
else
returnERROR;
}
//函数名:
Precede
//形参类型:
char,char
//函数功能判断运算符的优先关系
charPrecede(chart1,chart2){
charf;
switch(t2)
{
case'+':
case'-':
if(t1=='('||t1=='\n')
f='<';//t1 else f='>';//t1>t2 break; case'*': case'/': if(t1=='*'||t1=='/'||t1==')') f='>'; else f='<'; break; case'(': if(t1==')') { printf("括号不匹配\n"); exit(-1); } else f='<'; break; case')': switch(t1) { case'(': f='='; break; case'\n': printf("缺乏左括号\n"); exit(-1);default: f='>'; } break; case'\n': switch(t1) { case'\n': f='=';break;case'(': printf("缺乏右括号\n"); exit(-1); default: f='>';} } returnf; } //函数名: In //形参类型: char//函数功能判断是否为7种运算符之一 intIn(charc) { switch(c) { case'+': case'-': case'*': case'/': case'(': case')': case'\n': returnOK; default: returnERROR; } } //函数名: ShowStack//形参类型: SqStack //函数功能输出表达式的逆波兰式 voidShowStack(SqStackS){ inta,b; SqStackq; InitStack(&q); while(! EmptyStack(S)) { Pop(&S,&a,&b); Push(&q,a,b); } printf("原表达式转换成逆波兰式为\n"); while(! EmptyStack(q)) { Pop(&q,&a,&b); if(b==0) printf("%c",a); else printf("%d",a); } printf("\n"); } //函数名: Opertae//形参类型: int,char,int//函数功能做四则运算athetab intOperator_(inta,chartheta,intb) { switch(theta) { case'+': returna+b;case'-': returna-b; case'*': returna*b; } returna/b; } //函数名: GetValue//形参类型: SqStack //函数功能求的表达式的值 voidGetValue(SqStackS){ inta,b; SqStackq,p; intvalue; intm,n; intc,d; charz; InitStack(&q); InitStack(&p); while(! EmptyStack(S)) { Pop(&S,&a,&b); Push(&q,a,b);} while(! EmptyStack(q)) { Pop(&q,&a,&b); if(b==0) { Pop(&p,&m,&c); Pop(&p,&n,&d); z=toascii(a); value=Operator_(n,z,m); Push(&p,value,1); } else Push(&p,a,1); } Pop(&p,&a,&b); printf("表达式的值为: %d\n",a); return; } //函数名: EvaLuateExpression//形参类型: void //函数功能得到逆置的后缀表达式 voidEvaluateExpression() { SqStackOPRT,OPND;//设OPTR和OPND分别为运算符栈和运算数栈 d,x;char inty; charc; charz[11]; inti; InitStack(&OPRT); InitStack(&OPND); Push(&OPRT,'\n',0);//将换行符压入运算符栈的栈底 c=getchar(); GetTop(OPRT,&x);//将运算符栈OPTR的栈顶元素赋值给x while(c! ='\n'||x! ='\n') { if(In(c))//c是7种运算符之一 { switch(Precede(x,c))//判断x和c的优先级 { case'<': Push(&OPRT,c,0); c=getchar(); break;case'=': Pop(&OPRT,&x,&y); c=getchar(); break; case'>': Pop(&OPRT,&x,&y); Push(&OPND,x,y); } } elseif(c>='0'&&c<='9') { i=0; while(c>='0'&&c<='9'){ z[i++]=c; c=getchar();} z[i]='\0'; d=atoi(z);//将z中保存的数值型字符窜转化为整型存于d中 Push(&OPND,d,1); } else { printf("出现非法字符! \n"); exit(-1); } GetTop(OPRT,&x); } ShowStack(OPND); GetValue(OPND); } intmain(void) { printf("请输入表达式,负数用(0-正数)表示: "); EvaluateExpression(); return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中缀 表达式 波兰 求值