C语言实现表达式计算Word文档格式.docx
- 文档编号:5785414
- 上传时间:2023-05-05
- 格式:DOCX
- 页数:27
- 大小:315.44KB
C语言实现表达式计算Word文档格式.docx
《C语言实现表达式计算Word文档格式.docx》由会员分享,可在线阅读,更多相关《C语言实现表达式计算Word文档格式.docx(27页珍藏版)》请在冰点文库上搜索。
如果栈内元素的优先级大于等于当前元素的,则依次出栈元素进行计算。
每次计算要在数栈出栈两个整合后的数,先出栈的数字放在运算符后面,后出栈的数字放在运算符的前面,将运算以后的结果再次存入数栈。
如果遇到左括号则无条件进栈,并只在有右括号出现的时候才有可能出栈。
如果遇到右括号,则无条件让栈内元素出栈进行计算,直到左括号出栈为止。
如此计算将表达式所有元素全部索引。
之后再对栈内剩余元素进行操作。
为了方便计算,计算过程使用了函数体。
主函数只负责输入中缀表达式和输出最后的运算结果。
同时,建立了优先级函数使用了swich语句为每个运算符赋值优先级,方便在计算过程中直接调用。
也建立了运算函数对每个运算符做特定的运算,也是使用了swich语句。
另外,最后为了能够识别一些错误,在运算过程中加入了错误的判定,比如出栈时栈空或者左右符号不符等。
在编写过程中发现数栈的看栈顶没有使用过,所以删除了数栈的看栈顶。
二、算法流程图
中缀转后缀再计算的算法分两个流程,第一步是中缀表达式转换成后缀表达式;
图1中缀转后缀算法流程图
第二步是将后缀表达式进行计算输出。
图2后缀计算算法流程图
边转换边计算的算法只一个流程即可。
图3边转换边计算算法流程图
三、源代码
下面给出的是用中缀转后缀再计算的算法实现的程序的源代码:
#include<
stdio.h>
stdlib.h>
#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值*/
ren.level=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]=='
)/*处理运算符元素*/
tempsign.Type=exp1[index1];
tempsign.level=Com(tempsign.Type);
/*求运算符等级*/
while(OpPeek(&
OpStack).level>
=tempsign.level)
/*当栈中符的等级大于当前等级时则取出符存入后缀表达式*/
exp2[index2]=OpPop(&
OpStack).Type;
/*每两个运算符之间用空格分开*/
OpPush(&
OpStack,&
tempsign);
/*结束后将当前运算符入栈*/
if(exp1[index1]=='
('
)/*如果是左括号则无条件进栈*/
tempsign.level=-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]=='
tempsign.Type=exp[index];
/*当栈中符的等级大于当前等级时则取出符进行运算*/
tempch=OpPop(&
b=OdPop(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 实现 表达式 计算