- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第3章-栈和队列精选
各个算术操作符的优先级 isp叫做栈内(in stack priority)优先数 icp叫做栈外(in coming priority)优先数。 操作符优先数相等的情况只出现在括号配对时。 * 将栈OPND和OPTR初始化为空,并将’\0’入栈OPTR; 从左到右依次扫描中缀表达式的每个字符,放入ch中,执行下述操作; 2.1 若当前字符是运算对象,则入栈OPND,在中缀表达式中处理下个字符 2.2 若当前字符是运算符且优先级比栈OPTR的栈顶运算符的优先级高,则入栈OPTR,在中缀表达式中处理下一个字符; 算法描述——伪代码 * 2.3 若当前字符是运算符且优先级比栈OPTR的栈顶运算符的优先级低,则从栈OPND出栈两个运算对象,从栈OPTR出栈一个运算符进行运算,并将结果入栈OPND,继续当前字符; 2.4 若当前字符是运算符且优先级与栈OPTR的栈顶运算符的优先级相等,则将栈OPTR栈顶元素弹出,处理下一个字符; 3. 弹出栈OPTR中除’\0’外所有的元素,同时从OPND中出栈两个运算对象,并将结果入栈OPND; 4. 弹出栈OPND的栈顶元素即为所求结果 * int?calculate(char?infix[]){?? ????SeqStackchar?OPTR;?//运算符栈?? ????SeqStackint?OPND;?//操作数和中间结果栈???? ????OPTR.Push(\0);???????? ????int?i?=?0;?? ????char?ch?=?infix[i];???? ????int?a,b,result;?? ????char?c;???????? ????while(ch?!=?\0){?? ????????if(ch?=?0??ch?=?9){??????????????? ????????????OPND.Push(ch?-?0);?? ????????????ch?=?infix[++i];?? ????????}//if?? ????????else{?? ????????????if(icp(ch)??isp(OPTR.GetTop())){???????????????? ????????????????OPTR.Push(ch);?? ????????????????ch?=?infix[++i];???}?? ???????? ????????????else?if(icp(ch)??isp(OPTR.GetTop())){?? ????????????????b?=?OPND.Pop();?? ????????????????a?=?OPND.Pop();???????????????????? ????????????????c?=?OPTR.Pop();??????????????????? ????????????????if(c?==?+)???result?=?a?+?b;?? ????????????????if(c?==?-)???result?=?a?-?b;?? ????????????????if(c?==?*)???result?=?a?*?b;?? ????????????????if(c?==?/)???result?=?a?/?b;??????????????????? ????????????????OPND.Push(result);???}?? ????????????else{?? ????????????????OPTR.Pop();?? ????????????????ch?=?infix[++i];???}?? ????????}//if?? ????}//while???? ????while(OPTR.GetTop()?!=?\0){?? ????????b?=?OPND.Pop();?? ????????a?=?OPND.Pop();??? ????????c?=?OPTR.Pop();???????????? ????????if(c?==?+)???result?=?a?+?b;?? ????????if(c?==?-)???result?=?a?-?b;?? ????????if(c?==?*)???result?=?a?*?b;?? ????????if(c?==?/)???result?=?a?/?b;??????????????????????????????????OPND.Push(result);???????????}//while???? ????return?OPND.Pop();??}?? * * 问题是:当进栈元素的编号为1, 2, …, n时,可能的出
原创力文档


文档评论(0)