




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
数据结构之中缀表达式转后缀表达式我们在数学中常见的计算式,例如2+(3*4)叫做中缀表达式。表达式中涉及到了多个运算符,而运算符之间是有优先级的。计算机在计算并且处理这种表达式时,需要将中缀表达式转换成后缀表达式,然后再进行计算。中缀表达式转后缀表达式遵循以下原则:1.遇到操作数,直接输出;2.栈为空时,遇到运算符,入栈;3.遇到左括号,将其入栈;4.遇到右括号,执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出;5.遇到其他运算符'+''-''*''/'时,弹出所有优先级大于或等于该运算符的栈顶元素,然后将该运算符入栈;6.最终将栈中的元素依次出栈,输出。经过上面的步骤,得到的输出既是转换得到的后缀表达式。举例:a+b*c+(d*e+f)*g--------->abc*+de*f+g*+遇到a,直接输出:遇到+,此时栈为空,入栈:数据结构之中缀表达式转后缀表达式全文共11页,当前为第1页。遇到b,直接输出:数据结构之中缀表达式转后缀表达式全文共11页,当前为第1页。遇到*,优先级大于栈顶符号优先级,入栈:遇到c,输出:遇到+,目前站内的*与+优先级都大于或等于它,因此将栈内的*,+依次弹出并且输出,并且将遇到的这个+入栈:数据结构之中缀表达式转后缀表达式全文共11页,当前为第2页。数据结构之中缀表达式转后缀表达式全文共11页,当前为第2页。遇到d,直接输出:遇到*,由于*的优先级高于处在栈中的(,因此*入栈:遇到e,直接输出:数据结构之中缀表达式转后缀表达式全文共11页,当前为第3页。数据结构之中缀表达式转后缀表达式全文共11页,当前为第3页。遇到f,直接输出:遇到),弹出栈顶元素并且输出,直到弹出(才结束,在这里也就是弹出+输出,弹出(不输出:遇到*,优先级高于栈顶+,将*入栈:数据结构之中缀表达式转后缀表达式全文共11页,当前为第4页。数据结构之中缀表达式转后缀表达式全文共11页,当前为第4页。此时已经没有新的字符了,依次出栈并输出操作直到栈为空:明白了这个过程,现在就需要用代码实现了。对于各种运算符的优先级,可以使用整数来表示运算符的级别。可以定义一个函数来返回各种符号的优先级数字:/******************************************************************根据字符该字符是否在栈中,返回该字符的优先级。*这里只处理+、-、*、/、(、)这些符号。*需要注意的是:如果(在栈中,它的优先级是最低的,不在栈中则是最高的*@paramc:需要判断的字符*@paramflag:字符是否在栈中,0表示在栈中,1表示不在栈中*****************************************************************/intGetPrecedence(charc,intflag){ if(c=='+'||c=='-') { return1; } elseif(c=='*'||c=='/') { return2; } elseif(c=='('&&flag==0) {数据结构之中缀表达式转后缀表达式全文共11页,当前为第5页。数据结构之中缀表达式转后缀表达式全文共11页,当前为第5页。 } elseif(c=='('&&flag==1) { return3; } else { fprintf(stderr,"Inputcharisinvalid!\n"); return-1; }}/*****************************************************************判断一个字符是不是运算符*如果是合法的运算符+、-、*、/、(、)则返回0,否则返回1****************************************************************/intIsOperator(charc){ if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')') { return0; } else { return1; }}/*****************************************************************完整的代码如下:****************************************************************/#include<stdio.h>#include<stdlib.h>#defineElementTypechartypedefstructNode*PtrToNode;typedefPtrToNodeStack;typedefstructNode{ ElementTypeElement; PtrToNodeNext;数据结构之中缀表达式转后缀表达式全文共11页,当前为第6页。数据结构之中缀表达式转后缀表达式全文共11页,当前为第6页。intIsEmpty(StackS);StackCreateStack();voidDisposeStack(StackS);voidMakeEmpty(StackS);voidPush(ElementTypeX,StackS);ElementTypeTop(StackS);voidPop(StackS);//判断栈是否为空intIsEmpty(StackS){ returnS->Next==NULL;}//创建链栈StackCreateStack(){ StackS=malloc(sizeof(structNode)); if(S==NULL) { printf("Noenoughmemory!"); returnNULL; } S->Next=NULL; MakeEmpty(S); returnS;}//清空栈voidMakeEmpty(StackS){ if(S==NULL) { printf("UseCreateStackFirst!"); } else { while(!IsEmpty(S)) { Pop(S); } }}//进栈数据结构之中缀表达式转后缀表达式全文共11页,当前为第7页。voidP数据结构之中缀表达式转后缀表达式全文共11页,当前为第7页。{ PtrToNodeTmp; Tmp=malloc(sizeof(structNode)); if(Tmp!=NULL) { Tmp->Element=X; Tmp->Next=S->Next; S->Next=Tmp; } else { printf("Outofspace!"); }}//出栈voidPop(StackS){ if(IsEmpty(S)) { printf("TheStackisEmpty!"); } else { PtrToNodeTmp=S->Next; S->Next=Tmp->Next; free(Tmp); }}//返回栈顶元素ElementTypeTop(StackS){ if(IsEmpty(S)) { printf("Thestackisempty!"); return0; } else { returnS->Next->Element; }}数据结构之中缀表达式转后缀表达式全文共11页,当前为第8页。/**数据结构之中缀表达式转后缀表达式全文共11页,当前为第8页。*根据字符该字符是否在栈中,返回该字符的优先级。*这里只处理+、-、*、/、(、)这些符号。*需要注意的是:如果(在栈中,它的优先级是最低的,不在栈中则是最高的*@paramc:需要判断的字符*@paramflag:字符是否在栈中,0表示在栈中,1表示不在栈中*****************************************************************/intGetPrecedence(charc,intflag){ if(c=='+'||c=='-') { return1; } elseif(c=='*'||c=='/') { return2; } elseif(c=='('&&flag==0) { return0; } elseif(c=='('&&flag==1) { return3; } else { fprintf(stderr,"Inputcharisinvalid!\n"); return-1; }}/*****************************************************************判断一个字符是不是运算符*如果是合法的运算符+、-、*、/、(、)则返回0,否则返回1****************************************************************/intIsOperator(charc){ if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')') { return0; } else {数据结构之中缀表达式转后缀表达式全文共11页,当前为第9页。数据结构之中缀表达式转后缀表达式全文共11页,当前为第9页。 }}charOutput[50];//中缀表达式转成后缀表达式char*InfixToPostfix(char*ch,StackS){ intindex=0; charc; while((c=*ch)!='\0') { //不是运算符,将该字符放进输出字符数组中。 if(IsOperator(c)==1) { Output[index++]=c; ch++; } //是运算符 else { //如果此时栈为空,运算符进栈 if(IsEmpty(S)) { Push(c,S); ch++; continue; } else { if(c==')') { while(!IsEmpty(S)&&Top(S)!='(') { Output[index++]=Top(S); Pop(S); } Pop(S); ch++; continue; } else {数据结构之中缀表达式转后缀表达式全文共11页,当前为第10页。 intoutPrecedence=GetPrecedence(c,1);数据结构之中缀表达式转后缀表达式全文共11页,当前为第10页。 while(!IsEmpty(S)&&GetPrecedence(Top(S),0)>=outPrecedence) { Output[index++]=Top(S); Pop(S); } Push(c,S); ch++; continue; } } } } while(!IsEmpty(S)) { Output[index++]=Top(S); Pop(S); } Output[index]='\0'; returnOutput;}intmain(void){ Stac
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年河北省退役军人事务厅下属事业单位招聘考试笔试试题【答案】
- 2025年农商银行反洗钱知识竞赛培训考试试题【答案】
- 项目日常管理制度
- 消防自然灾害应急救援预案
- 领导干部学习党的.教育实践活动心得体会
- 2025年涂镀产品:镀铝锌合作协议书
- 消防员辞职保证书
- 翔隆花园人货梯专项方案
- 湘艺版四年级上册音乐《卓玛》教案 (一)
- 2025年汽车内外饰件合作协议书
- 商场人员出入管理制度
- 工程监理资料管理制度
- DB31/T 560-2011道路清扫保洁作业道班房设置和设计要求
- 2025-2030废电池回收产业发展分析及发展趋势与投资前景预测报告
- 2026届高职单招考试大纲英语词汇(音标版)
- 中小学办学思想凝练的主要路径
- 危险性较大的分部分项工程专项施工方案严重缺陷清单(试行)2025解读
- 2024执业兽医资格证考试真题及答案
- 鼠标操作测试题及答案
- 2023年福建省松溪县事业单位公开招聘辅警35名笔试题带答案
- 浙江国企招聘2025绍兴市镜湖开发集团有限公司下属国企招聘11人笔试参考题库附带答案详解
评论
0/150
提交评论