c语言后缀表达式计算Word文件下载.docx
- 文档编号:16027150
- 上传时间:2022-11-17
- 格式:DOCX
- 页数:24
- 大小:122.79KB
c语言后缀表达式计算Word文件下载.docx
《c语言后缀表达式计算Word文件下载.docx》由会员分享,可在线阅读,更多相关《c语言后缀表达式计算Word文件下载.docx(24页珍藏版)》请在冰豆网上搜索。
/'
时,就判断其后面的数字是否为0,如果为0报错。
取余运算:
取余运算时,操作数判断是否为整数,不为整数报错。
二、算法流程图
第一种算法:
先将表达式转化为后缀表达式,然后计算
其主函数流程图为:
图1主函数算法流程图
其中将中缀表达式转化为后缀表达式的主要流程为:
图2中缀转化为后缀算法流程图
后缀表达式的计算,实现的流程图为:
图3后缀表达式计算算法流程图
下面介绍直接计算出结果的算法的实现:
图4直接计算中缀表达式算法流程图
三、源代码
下面给出的是用先转后缀再计算和直接计算的算法实现的程序的源代码:
#include<
>
/*导入需要用到的各种包*/
typedefstruct/*定义结构体用来存储操作符*/
{
charop;
/*存储字符*/
intlevel;
/*存储优先级*/
}OpNode;
typedefstruct
OpNodeop[100];
inttop;
intsize;
/*表示栈内元素的个数*/
}stack;
/*定义符号栈*/
voidinit(stack*st)/*初始化栈*/
st->
size=0;
top=0;
}
OpNodepop(stack*a)/*出栈*/
if(a->
size==0)/*如果栈为空结束操作*/
{
exit(-1);
}
a->
size--;
returna->
op[--(a->
top)];
/*取出栈顶元素*/
voidpush(stack*a,OpNodeop)/*入栈函数*/
size++;
op[(a->
top)++]=op;
OpNodetop(stack*a)/*观察栈顶函数*/
printf("
stackisempty\n"
);
}
top)-1];
/*只得到栈顶的值而不出栈*/
typedefstruct/*定义数值栈*/
doublenum[100];
/*栈顶指针*/
}numstack;
voidinit2(numstack*st)/*初始化数值栈*/
doublepop2(numstack*a)/*数值栈出栈*/
size==0)/*出栈前的判空*/
num[--(a->
/*得到栈顶的值*/
voidpush2(numstack*a,doublenum)/*入栈*/
num[(a->
top)++]=num;
voidmain()/*主函数*/
voidchange(charstr[],charexp[]);
/*声明要用到的各个函数*/
doubleCalResult(charexp[]);
/*声明后缀表达式的计算函数*/
doubleDirectcalresult(charstr[]);
intcheck(charstr[],charchestr[100]);
charstr[100],exp[100],chestr[100];
/*str存储原算术表达式,exp存储对应的printf("
算术表达式为:
\n"
后缀表达式,chestr存储容错字符'
^'
*/
gets(str);
if(check(str,chestr))/*调用容错函数*/
{printf("
表达式错在:
%s\n"
str);
printf(chestr);
/*根据输入情况指出错误的地方*/
exit(-1);
change(str,exp);
/*调用函数将中缀转化为后缀*/
后缀表达式为:
exp);
运算结果为:
%f\n"
CalResult(exp));
/*调用函数计算后缀表达式*/
printf("
直接运算的结果为:
Directcalresult(str));
/*调用直接计算函数*/
voidchange(charstr[],charch[])/*将前缀表达式转化为后缀表达式*/
inti=0;
/*str的索引*/
intk=0;
charc;
/*字符串中取出的放在C中*/
stackst;
OpNodeop;
OpNodeops;
init(&
st);
/*初始化符号栈*/
c=str[i++];
while(c!
='
\0'
)/*对字符串进行扫描*/
if((c>
0'
&
c<
9'
)||c=='
.'
)/*如果字符为数字或小数点*/
{
while((c>
)
{
ch[k++]=c;
/*将字符直接放入数组中*/
c=str[i++];
}
ch[k++]='
|'
;
/*在其后面放入一个分隔符*/
}
if(c=='
('
)/*如果字符是左括号*/
{
='
=-1;
/*定义其优先级为-1*/
push(&
st,op);
/*将左括号直接入栈*/
if(c=='
)'
)/*如果字符为右括号*/
op=top(&
/*首先观察栈顶*/
while!
=0&
!
)/*如果不是左括号并且栈不为空*/
op=pop(&
/*出栈并存入数组中*/
ch[k++]=;
if>
0)/*再次检查栈是否为空,*/
op=top(&
elsebreak;
/*为空就结束*/
}
pop(&
/*去掉左括号*/
+'
||c=='
-'
)/*如果是+-号*/
=c;
=1;
/*优先级为1*/
if==0)
push(&
/*如果此时栈为空直接入栈*/
else
ops=top(&
/*观察栈顶*/
while>
=/*如果栈顶优先级高*/
{
ops=pop(&
ch[k++]=;
/*将栈顶元素取出存入数组中*/
if>
0)
ops=top(&
/*进行判空操作,栈为空结束*/
else
break;
}
/*此时栈顶优先级低,入栈*/
*'
%'
)/*如果是*/进行*/
=c;
=2;
if==0)
if>
ops=top(&
else
break;
}
/*索引自加检索下一个字符*/
while!
=0)/*最后判断栈如果不为空*/
ops=pop(&
/*取出栈内元素存入数组中*/
ch[k]='
/*将\0作为结尾存入数组*/
doubleCalResult(charexp[])/*后缀表达式的计算*/
numstacknumst;
/*建立数值栈*/
doubled1,d2,dr;
/*后缀表达式的索引*/
/*将字符转化为浮点数的索引*/
char*s;
chartrans[100];
/*存字符表示的一段数字*/
init2(&
numst);
/*实现数值栈*
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 后缀 表达式 计算