中缀表达式转后缀表达式
来源:互联网 发布:阿里云的天池数据赛 编辑:程序博客网 时间:2024/05/16 05:11
#include <stdio.h>#include <stdlib.h>#define ElementType chartypedef struct Node *PtrToNode;typedef PtrToNode Stack;typedef struct Node{ ElementType Element; PtrToNode Next;};int IsEmpty(Stack S);Stack CreateStack();void DisposeStack(Stack S);void MakeEmpty(Stack S);void Push(ElementType X,Stack S);ElementType Top(Stack S);void Pop(Stack S);//判断栈是否为空int IsEmpty(Stack S){ return S->Next == NULL;}//创建链栈Stack CreateStack(){ Stack S = malloc(sizeof(struct Node)); if(S == NULL) { printf("No enough memory!"); return NULL; } S->Next = NULL; MakeEmpty(S); return S;}//清空栈void MakeEmpty(Stack S){ if(S == NULL) { printf("Use CreateStack First!"); } else { while(!IsEmpty(S)) { Pop(S); } }}//进栈void Push(ElementType X,Stack S){ PtrToNode Tmp; Tmp = malloc(sizeof(struct Node)); if(Tmp != NULL) { Tmp->Element = X; Tmp->Next = S->Next; S->Next = Tmp; } else { printf("Out of space!"); }}//出栈void Pop(Stack S){ if(IsEmpty(S)) { printf("The Stack is Empty!"); } else { PtrToNode Tmp = S->Next; S->Next = Tmp->Next; free(Tmp); }}//返回栈顶元素ElementType Top(Stack S){ if(IsEmpty(S)) { printf("The stack is empty!"); return 0; } else { return S->Next->Element; }}/******************************************************************根据字符该字符是否在栈中,返回该字符的优先级。*这里只处理+、-、*、/、(、)这些符号。*需要注意的是:如果(在栈中,它的优先级是最低的,不在栈中则是最高的*@param c:需要判断的字符*@param flag:字符是否在栈中,0表示在栈中,1表示不在栈中*****************************************************************/int GetPrecedence(char c,int flag){ if(c=='+' || c=='-') { return 1; } else if(c=='*' || c=='/') { return 2; } else if(c=='(' && flag==0) { return 0; } else if(c=='(' && flag==1) { return 3; } else { fprintf(stderr,"Input char is invalid!\n"); return -1; }}/*****************************************************************判断一个字符是不是运算符*如果是合法的运算符+、-、*、/、(、)则返回0,否则返回1****************************************************************/int IsOperator(char c){ if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')') { return 0; } else { return 1; }}//中缀表达式转成后缀表达式char* InfixToPostfix(int i,char *ch,Stack S){ char * Output=malloc(sizeof(char)*i);//存放转换后的数组 int index=0; char c; 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 { int outPrecedence = GetPrecedence(c,1); 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'; return Output;}int main(void){ Stack S = CreateStack(); char *charSequence = "1+2*3+(4*5+6)*7"; char tmp; char *out = InfixToPostfix(50,charSequence,S); while((tmp=*out)!='\0') { printf("%c ",tmp); out++; } printf("\n"); return 0;}
</pre><pre name="code" class="cpp">运行结果:
<img src="http://img.blog.csdn.net/20150425150841363?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZnVqaWFtaW5nMTIz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
0 0
- 中缀转后缀表达式
- 表达式中缀转后缀
- 中缀转后缀表达式
- 中缀表达式转后缀表达式
- 中缀表达式转后缀表达式
- 中缀表达式转后缀表达式
- 中缀表达式转后缀表达式
- 中缀表达式转后缀表达式
- 中缀表达式转后缀表达式
- 中缀表达式转后缀表达式
- 中缀表达式转后缀表达式
- 后缀表达式转中缀表达式
- 中缀表达式转后缀表达式
- 中缀表达式转后缀表达式
- 中缀表达式转后缀表达式
- 中缀表达式转后缀表达式
- 中缀表达式转后缀表达式
- 中缀表达式转后缀表达式
- Spring mvc 源码 和 Spring+springmvc+hibernate整合源码
- 企业网站程序介绍
- shell技巧
- 十一个常见的PHP安全细则
- Oracle中的约束
- 中缀表达式转后缀表达式
- Java Web高级特性之(三)拦截器
- vs2012 c# GridView控件连接sql 数据库
- Java——ProcessBuilder类的使用及获取APK信息
- html5.0学习
- SpringMVC 配置多视图解析器(velocity,jsp)
- OpenGL编程逐步深入(九)插值处理
- MATERIALISE_MAGICS_TOOLING_EXPERT_V2.1.1-LND
- 服务器系统管理 工具记录