表达式求值.docx

上传人:b****5 文档编号:29371515 上传时间:2023-07-22 格式:DOCX 页数:10 大小:22.95KB
下载 相关 举报
表达式求值.docx_第1页
第1页 / 共10页
表达式求值.docx_第2页
第2页 / 共10页
表达式求值.docx_第3页
第3页 / 共10页
表达式求值.docx_第4页
第4页 / 共10页
表达式求值.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

表达式求值.docx

《表达式求值.docx》由会员分享,可在线阅读,更多相关《表达式求值.docx(10页珍藏版)》请在冰豆网上搜索。

表达式求值.docx

表达式求值

结果截图:

源代码:

#include

#include

intk;

typedefintSElemType;

#defineSTACK_INIT_SIZE10

#defineSTACKINCREMENT2

typedefstructSqStack

{

SElemType*base;//在栈构造之前和销毁之后,base的值为NULL

SElemType*top;//栈顶指针

intstacksize;//当前已分配的存储空间,以元素为单位

}SqStack;//顺序栈

 

//构造一个空栈S。

intInitStack(SqStack*S)

{

//为栈底分配一个指定大小的存储空间

(*S).base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));

if(!

(*S).base)

exit(0);//存储分配失败

(*S).top=(*S).base;//栈底与栈顶相同表示一个空栈

(*S).stacksize=STACK_INIT_SIZE;

return1;

}

//若栈不空,则用e返回S的栈顶元素,并返回1;否则返回0。

intGetTop(SqStackS,SElemType*e)

{

if(S.top>S.base)

{

*e=*(S.top-1);//栈顶指针的下一个位置为栈顶元素

return1;

}

else

return0;

}

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

intPush(SqStack*S,SElemTypee)

{

if((*S).top-(*S).base>=(*S).stacksize)//栈满,追加存储空间

{

(*S).base=(SElemType*)realloc((*S).base,

((*S).stacksize+STACKINCREMENT)*sizeof(SElemType));

if(!

(*S).base)

exit(0);//存储分配失败

(*S).top=(*S).base+(*S).stacksize;

(*S).stacksize+=STACKINCREMENT;

}

*((*S).top)++=e;

//这个等式的++*优先级相同,但是它们的运算方式,是自右向左

return1;

}

//若栈不空,则删除S的栈顶元素,用e返回其值,并返回1;否则返回0。

intPop(SqStack*S,SElemType*e)

{

if((*S).top==(*S).base)

return0;

*e=*--(*S).top;

return1;

}

 

SElemTypePrecede(SElemTypet1,SElemTypet2)

{

SElemTypef;

switch(t2)

{

case'+':

case'-':

if(t1=='('||t1=='=')

f='<';

else

f='>';

break;

case'*':

case'/':

if(t1=='*'||t1=='/'||t1==')')

f='>';

else

f='<';

break;

case'(':

if(t1==')')

{

printf("ERROR1\n");

exit(0);

}

else

f='<';

break;

case')':

switch(t1)

{

case'(':

f='=';

break;

case'=':

printf("ERROR2\n");

exit(0);

default:

f='>';

}

break;

case'=':

switch(t1)

{

case'=':

f='=';

break;

case'(':

printf("ERROR2\n");

exit(0);

default:

f='>';

}

}

returnf;

}

//判断c是否为运算符。

intIn(SElemTypec)

{

switch(c)

{

case'+':

case'-':

case'*':

case'/':

case'(':

case')':

case'=':

return1;

default:

return0;

}

}

SElemTypeOperate(SElemTypea,SElemTypetheta,SElemTypeb)

{

SElemTypec;

switch(theta)

{

case'+':

c=a+b;

break;

case'-':

c=a-b;

break;

case'*':

c=a*b;

break;

case'/':

c=a/b;

}

returnc;

}

//算术表达式求值的算符优先算法。

设OPTR和OPND分别为运算符栈和运算数栈

SElemTypeEvaluateExpression()

{

SqStackOPTR,OPND;

SElemTypea,b,d,x,theta;

charc;//存放由键盘接收的字符串

charz[6];//存放整数字符串

inti;

InitStack(&OPTR);//初始化运算符栈

Push(&OPTR,'=');//=是表达式结束标志

InitStack(&OPND);//初始化运算数栈

c=getchar();

GetTop(OPTR,&x);

while(c!

='='||x!

='=')

{

if(In(c))//是7种运算符之一

switch(Precede(x,c))

{

case'<':

Push(&OPTR,c);//栈顶元素优先权低

c=getchar();

break;

case'=':

Pop(&OPTR,&x);//脱括号并接收下一字符

c=getchar();

break;

case'>':

Pop(&OPTR,&theta);//退栈并将运算结果入栈

Pop(&OPND,&b);

Pop(&OPND,&a);

Push(&OPND,Operate(a,theta,b));

}

elseif(c>='0'&&c<='9')//c是操作数

{

i=0;

do

{

z[i]=c;

i++;

c=getchar();

}while(c>='0'&&c<='9');

z[i]=0;

d=atoi(z);//将字符串数组转为整型存于d

Push(&OPND,d);

}

else//c是非法字符

{

//printf("ERROR3\n");

//exit(0);

}

GetTop(OPTR,&x);

}

GetTop(OPND,&x);

returnx;

}

voidspace()

{

printf("");

}

voidspace1()

{

printf("");

}

voidstar()

{

printf("*****************************************");

}

voidsizemain()

{

voidspace1();

voidstar();

star();

printf("\n\n");

space1();

printf("四则运算演示\n");

printf("\n\n");

star();

printf("\n请输入算术表达式,负数要用(0-正数)表示,并以=结束:

\n");

printf("表达式结果:

%d\n",EvaluateExpression());

return0;

}

intmain()

{

voidsizemain();

sizemain();

return0;

}

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

当前位置:首页 > 工程科技 > 电力水利

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

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