C语言实现表达式计算Word文档格式.docx

上传人:b****4 文档编号:8244322 上传时间:2023-05-10 格式:DOCX 页数:23 大小:314.95KB
下载 相关 举报
C语言实现表达式计算Word文档格式.docx_第1页
第1页 / 共23页
C语言实现表达式计算Word文档格式.docx_第2页
第2页 / 共23页
C语言实现表达式计算Word文档格式.docx_第3页
第3页 / 共23页
C语言实现表达式计算Word文档格式.docx_第4页
第4页 / 共23页
C语言实现表达式计算Word文档格式.docx_第5页
第5页 / 共23页
C语言实现表达式计算Word文档格式.docx_第6页
第6页 / 共23页
C语言实现表达式计算Word文档格式.docx_第7页
第7页 / 共23页
C语言实现表达式计算Word文档格式.docx_第8页
第8页 / 共23页
C语言实现表达式计算Word文档格式.docx_第9页
第9页 / 共23页
C语言实现表达式计算Word文档格式.docx_第10页
第10页 / 共23页
C语言实现表达式计算Word文档格式.docx_第11页
第11页 / 共23页
C语言实现表达式计算Word文档格式.docx_第12页
第12页 / 共23页
C语言实现表达式计算Word文档格式.docx_第13页
第13页 / 共23页
C语言实现表达式计算Word文档格式.docx_第14页
第14页 / 共23页
C语言实现表达式计算Word文档格式.docx_第15页
第15页 / 共23页
C语言实现表达式计算Word文档格式.docx_第16页
第16页 / 共23页
C语言实现表达式计算Word文档格式.docx_第17页
第17页 / 共23页
C语言实现表达式计算Word文档格式.docx_第18页
第18页 / 共23页
C语言实现表达式计算Word文档格式.docx_第19页
第19页 / 共23页
C语言实现表达式计算Word文档格式.docx_第20页
第20页 / 共23页
亲,该文档总共23页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

C语言实现表达式计算Word文档格式.docx

《C语言实现表达式计算Word文档格式.docx》由会员分享,可在线阅读,更多相关《C语言实现表达式计算Word文档格式.docx(23页珍藏版)》请在冰点文库上搜索。

C语言实现表达式计算Word文档格式.docx

如果栈内元素的优先级大于等于当前元素的,则依次出栈元素进行计算。

每次计算要在数栈出栈两个整合后的数,先出栈的数字放在运算符后面,后出栈的数字放在运算符的前面,将运算以后的结果再次存入数栈。

如果遇到左括号则无条件进栈,并只在有右括号出现的时候才有可能出栈。

如果遇到右括号,则无条件让栈内元素出栈进行计算,直到左括号出栈为止。

如此计算将表达式所有元素全部索引。

之后再对栈内剩余元素进行操作。

为了方便计算,计算过程使用了函数体。

主函数只负责输入中缀表达式和输出最后的运算结果。

同时,建立了优先级函数使用了swich语句为每个运算符赋值优先级,方便在计算过程中直接调用。

也建立了运算函数对每个运算符做特定的运算,也是使用了swich语句。

另外,最后为了能够识别一些错误,在运算过程中加入了错误的判定,比如出栈时栈空或者左右符号不符等。

在编写过程中发现数栈的看栈顶没有使用过,所以删除了数栈的看栈顶。

二、算法流程图

中缀转后缀再计算的算法分两个流程,第一步是中缀表达式转换成后缀表达式;

图1中缀转后缀算法流程图

第二步是将后缀表达式进行计算输出。

图2后缀计算算法流程图

边转换边计算的算法只一个流程即可。

图3边转换边计算算法流程图

三、源代码

下面给出的是用中缀转后缀再计算的算法实现的程序的源代码:

#include<

>

#defineN100/*N为数栈和表达式数组容量*/

#defineM50/*M为符栈和其他数组容量*/

typedefstruct/*定义运算符类型,level为运算符等级*/

{

charType;

intlevel;

}Type;

typedefstruct/*定义数栈*/

doublestack[N];

inttop;

}OdStack;

typedefstruct/*定义符栈*/

Typestack[M];

}OpStack;

voidInit_OdStack(OdStack*s)/*定义初始化数栈*/

{(*s).top=0;

}

voidOdPush(OdStack*s,doublen)/*进数栈*/

if((*s).top==N-1)/*如果栈满则报错退出程序*/

Error();

(*s).stack[(*s).top]=n;

(*s).top++;

}

doubleOdPop(OdStack*s)/*定义出数栈*/

if((*s).top==0)/*如果栈空则报错退出程序*/

else

{

(*s).top--;

return(*s).stack[(*s).top];

voidInit_OpStack(OpStack*s)/*定义初始化符栈*/

voidOpPush(OpStack*s,Type*sign)/*定义进符栈*/

if((*s).top==M-1)/*如果栈满则报错退出程序*/

(*s).stack[(*s).top]=*sign;

TypeOpPop(OpStack*s)/*定义出符栈*/

if((*s).top==0)/*栈空则报错退出程序*/

TypeOpPeek(OpStack*s)/*定义看符栈顶*/

Typeren;

if((*s).top==0)/*判栈空,空则赋等级0值*/

=0;

returnren;

return(*s).stack[(*s).top-1];

intError()/*报错函数*/

printf("

Error!

"

);

getch();

exit

(1);

intCom(chartempch)/*定义运算符等级*/

/*给不同运算符定级*/

switch(tempch)

case'

+'

:

-'

level=1;

break;

*'

/'

%'

level=2;

returnlevel;

doubleOper(doublea,doubleb,chartempch)/*定义运算过程*/

doubleren;

switch(tempch)/*对不同运算符执行运算并返回结果*/

ren=b+a;

ren=b-a;

ren=b*a;

ren=b/a;

ren=(int)b%(int)a;

/*取模运算将数取整*/

doubleCalu(char*exp1)

OdStackOdStack;

/*定义数栈*/

OpStackOpStack;

/*定义符栈*/

Typetempsign;

/*定义Type型运算符*/

charexp2[N],tempexp[M],tempch;

/*定义后缀表达式数组exp2,整合数组tempexp,tempch为运算符*/

intindex1,index2,tempindex;

/*index1为主要索引,index2为次要索引,tempindex为附加索引*/

doublenumber,a,b,c;

/*number为整合数,a、b、c为运算数*/

Init_OdStack(&

OdStack);

/*初始化数栈*/

Init_OpStack(&

OpStack);

/*初始化符栈*/

index1=0;

/*初始化索引,附加索引*/

index2=0;

tempindex=0;

tempexp[0]='

\0'

;

/*初始化整合数组*/

while(exp1[index1]!

='

)/*处理初始表达式转化成后缀表达式*/

if((exp1[index1]>

0'

&

exp1[index1]<

9'

))/*处理数字元素*/

while((exp1[index1]>

)||exp1[index1]=='

.'

{

exp2[index2]=exp1[index1];

/*连续的数字元素不分开并依次存入后缀表达式*/

index2++;

index1++;

exp2[index2]='

'

/*结束后用空格将其与后面的元素分开*/

if(exp1[index1]=='

||exp1[index1]=='

)/*处理运算符元素*/

=exp1[index1];

=Com;

/*求运算符等级*/

while(OpPeek(&

OpStack).level>

=

/*当栈中符的等级大于当前等级时则取出符存入后缀表达式*/

exp2[index2]=OpPop(&

OpStack).Type;

/*每两个运算符之间用空格分开*/

OpPush(&

OpStack,&

tempsign);

/*结束后将当前运算符入栈*/

if(exp1[index1]=='

('

)/*如果是左括号则无条件进栈*/

=-1;

/*进栈后等级为-1,以便遇到右括号出栈*/

)'

)/*右括号规则*/

OpStack).level!

=-1)

/*遇到右括号则不断出栈存入后缀表达式直到寻到左括号*/

OpPop(&

/*直到遇到左括号将左括号出栈*/

else/*如果输入了非法字符则报错退出程序*/

=0)/*原表达式结束后对栈进行操作直到栈空*/

if(OpPeek(&

OpStack).level==-1)/*如果有为用掉的左括号则报错退出程序*/

;

/*最后结束后缀表达式*/

\nThePostExpressionis:

\n%s"

exp2);

/*得到后缀表达式*/

/*索引归零,开始计算结果*/

while(exp2[index1]!

='

)/*循环直到后缀表达式结束*/

if((exp2[index1]>

exp2[index1]<

))/*整合数并入栈*/

while((exp2[index1]>

)||exp2[index1]=='

/*用附加索引判断数的长度并整合入整合数组*/

tempexp[tempindex]=exp2[index1];

tempindex++;

tempexp[tempindex]='

/*结束整合数组*/

if(tempexp[0]!

)/*如果整合数组有值则转换成浮点型存入数栈*/

number=atof(tempexp);

OdPush(&

OdStack,number);

/*入栈后初始化整合数组和附加索引以便下次整合*/

if(exp2[index1]=='

)/*判断空格,有则跳过*/

while(exp2[index1]=='

if(exp2[index1]=='

||exp2[index1]=='

/*对加减乘除和取模进行运算*/

a=OdPop(&

b=OdPop(&

tempch=exp2[index1];

c=Oper(a,b,tempch);

OdStack,c);

/*将计算结果放入数栈*/

returnOdPop(&

OdStack);

/*弹出结果*/

main()

charstr[N];

/*定义数组以存储表达式*/

doubleresult;

/*定义result以存储结果*/

PleaseEntertheExpression:

\n"

scanf("

%s"

str);

result=Calu(str);

/*计算表达式并返回结果值*/

\nTheresultis:

\n%f"

result);

 

下面给出的是用边转换边运算的算法实现的程序的源代码:

voidInit_OdStack(OdStack*s)/*定义初始化数栈*/

}

doubleOper(doublea,doubleb,chartempch)/*定义运算过程*/

doubleCalu(char*exp)/*定义计算过程,依次读入字符*/

chartempexp[M],tempch;

/*定义整合数组tempexp,tempch为运算符*/

intindex,tempindex;

/*index为索引,tempindex为附加索引*/

index=0;

while(exp[index]!

)/*执行操作直到表达式结束*/

if((exp[index]>

exp[index]<

))/*整合数并入栈*/

while((exp[index]>

)||exp[index]=='

tempexp[tempindex]=exp[index];

index++;

if(tempexp[0]!

)/*如果整合数组有值则转换成浮点型存入数栈*/

number=atof(tempexp);

if(exp[index]=='

||exp[index]=='

=exp[index];

/*当栈中符的等级大于当前等级时则取出符进行运算*/

tempch=OpPop(&

/*直到无法运算将当前符放入栈中*/

)/*如果是左括号则无条件进栈*

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

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2