【Java精品源码栏目提醒】:文章导读:在新的一年中,各位网友都进入紧张的学习或是工作阶段。
网学会员整理了Java精品源码-【精品】中缀表达式转化为后缀表达式算法及后缀表达式计算算法 - 其它资料的相关内容供大家参考,祝大家在新的一年里工作和学习顺利!
上机实习四一,实验题目:中缀表达式转化为后缀表达式算法及后缀表达式计算算法的实现二,实验目的:结合堆栈入栈出栈的特点解决实际问题。
输入一个含、-、、/、正整数和圆括号的合法的中缀表示的算术表达式,输出转化得到的后缀表达式,计算该表达式的运算结果。
三,功能层次图 其主函数流程图为: 得到用户输 入 存在错误 报错并结束 调用容错函 数 返回计算结果 无错 调用函数得 到 后缀表达 式的计算 调用直接 计四,运行结果五,小结 在做这个程序的时候,虽然遇到一些问题,但最后都被我解决, 自信心上得到比 较大的提升,这也是这次实践最大的收获。
同时,知识上的收获也是不可忽视的,亲 手解决问题的过程也是很好的学习过程,并且积累了一些经验,相信会为以后的学习 发展带来非常积极的帮助。
源代码:include /导入需要用到的各种包/includeincludetypedef struct /定义结构体用来存储操作符/ char op /存储字符/ int level /存储优先级/OpNodetypedef structOpNode op100int topint size /表示栈内元素的个数/ stack /定义符号栈/void initstack st /初始化栈/st-size0st-top0OpNode popstack a / 出栈/if a-size0 /如果栈为空结束操作/ exit-1a-size--return a-op--a-top /取出栈顶元素/void pushstack aOpNode op /入栈函数/a-sizea-opa-topopOpNode topstack a /观察栈顶函数/if a-size0 /如果栈为空结束操作/ printfstack is emptyn exit-1return a-opa-top-1 /只得到栈顶的值而不出栈/typedef struct /定义数值栈/double num100int top /栈顶指针/int size numstackvoid init2numstack st /初始化数值栈/st-size0st-top0double pop2numstack a /数值栈出栈/if a-size0 /出栈前的判空/ exit-1a-size--return a-num--a-top /得到栈顶的值/void push2numstack adouble num /入栈/a-sizea-numa-topnumvoid main /主函数/ char chy void change char strchar exp /声明要用到的各个函数/ double CalResultchar exp /声明后缀表达式的计算函数/ double Directcalresultchar str int checkchar strchar chestr100 char str100exp100chestr100 /str 存储原算术表达式,exp 存储对应的后缀表达式chestr存储容错字符/ do printf算术表达式为:n getsstr ifcheckstrchestr /调用容错函数/ printf表达式错在:n printfsnstr printfchestr /根据输入情况指出错误的地方/ printfn printfTry agian:: whilechgetcharchnchy ifchysystempausecontinue ifchn systempauseexit-1 changestrexp /调用函数将中缀转化为后缀/ printf后缀表达式为:snexp printf运算结果为: fnCalResultexp /调用函数计算后缀表达式/ printfTry agian:: whilechgetcharchnchy systempause whilechnvoid change char strchar ch /将前缀表达式转化为后缀表达式/ int i0 /str 的索引/ int k0 char c /字符串中取出的放在 C 中/ stack st /定义符号栈/ OpNode op OpNode ops initst /初始化符号栈/ cstri while c0 /对字符串进行扫描/ if c0c0c0 /再次检查栈是否为空,/ optopst else break /为空就结束/ popst /去掉左括号/if cc- /如果是-号/ op.opc op.level1 /优先级为 1/ if st.size0 pushstop /如果此时栈为空直接入栈/ else opstopst /观察栈顶/ while ops.levelop.level /如果栈顶优先级高/ opspopst chkops.op /将栈顶元素取出存入数组中/ if st.size0 opstopst /进行判空操作,栈为空结束/ else break pushstop /此时栈顶优先级低,入栈/ ifcc/c /如果是进行/ op.opc op.level2 /优先级为 1/ if st.size0 pushstop /如果此时栈为空直接入栈/ else opstopst /观察栈顶/ while ops.levelop.level /如果栈顶优先级高/ opspopst /将栈顶元素取出存入数组中/ chkops.op if st.size0 opstopst /进行判空操作,栈为空结束/ else break pushstop /此时栈顶优先级低,入栈/ cstri /索引自加检索下一个字符/ whilest.size0 /最后判断栈如果不为空/ opspopst /取出栈内元素存入数组中/ chkops.op chk0 /将0 作为结尾存入数组/double CalResultchar exp /后缀表达式的计算/ char c numstack numst /建立数值栈/ double d1d2dr int k0 /后缀表达式的索引/ int i0 /将字符转化为浮点数的索引/ char s char trans100 /存字符表示的一段数字/ init2 numst /实现数值栈/ cexpk while c0 /开始扫描后缀表达式/ ifcc-cc/c /如果是操作符/ switchc case : /如果是加法操作/ d2pop2numst d1pop2numst drd1d2 /相加后入栈/ push2numstdr break case - : /如果是减法操作/ d2pop2numst d1pop2numst drd1-d2 /相减后入栈/ push2numstdr break case : /如果是乘法操作/ d2pop2numst d1pop2numst drd1d2 /相乘后入栈/ push2numstdr break case / : /如果是除法操作/ d2pop2numst d1pop2numst drd1/d2 /相除后入栈/ push2numstdr break case : /如果是取余操作/ d2pop2numst d1pop2numst drdoubleintd1intd2 /类型转化并取余后入栈/ push2numstdr break if c0c0c0 templntopms /如果栈空结束/ else break pushmstempn /操作符入栈/ ifcc/c /如果是操作/ tempn.level2 /定义优先级为 2/ tempn.opc ifms.size0 pushmstempn /栈空直接入栈/ else templntopms while templn.leveltempn.level /栈顶优先级高/ templnpopms /取出操作数和操作符计算/ odbpop2mns odapop2mns odrcalculateodaodbtempln push2mnsodr /结算结果入栈/ ifms.size0 templntopms else break /如果栈空结束/ templntopms pushmstempn /操作符入栈/ ifc /如果是左括号/ tempn.level-1 tempn.opc /直接入栈优先级定位-1/ pushmstempnifc /如果是右括号/ whiletempn.op /遇到左括号结束/ templnpopms odbpop2mns /从数栈中取两个数,从符号栈里取操作符/ odapop2mns odrcalculateodaodbtempln /计算出结果入栈/ push2mnsodr if ms.size0 tempntopms else break /如果栈空结束/ popms /取出左括号/ tempntopms while1 templnpopms odbpop2mns /从数栈中取两个数,从符号栈里取操作符/ odapop2mns odrcalculateodaodbtempln /计算出结果入栈/ push2mnsodr if ms.size0 tempntopms /如果栈空结束/ else break result pop2mns /最后的结果在数值栈中返回/ return resultdouble calculatedouble od1double od2OpNode op /已知操作符和操作数的计算/ switchop.op case : return od1od2 case - : return od1-od2 /判断操作符是哪个执行相应计算/ case : return od1od2 case / : return od1/od2 case : return doubleintod1intod2 return 0 /如果上面的都没有执行返回 0/int checkchar strchar chestr100 /容错函数/ char c char cdivide int i0 /str 的索引/ stack che /括号匹配用到的栈/ OpNode temp int k0 /chestr 的索引/ int isintegerchar integer100 /计算是判断是否是整数/ char s110 /操作时存储左右的数字/ char s210 int indexs10 /s1s2 的索引/ int indexs20 int j /数组 chestr 索引/ int flag0 /0--没有出错 1--有错/ int tag0 init checstri /开始扫描/forj0j0 popche /栈不为空就取出一个左括号/ else flag1 printf缺少左括号n /否则提示有错/
上一篇:
Java 图形结构
下一篇:
bc80e7a0-d1f2-4595-b21d-01a76798e87a