首页 > 代码库 > 中缀表达式转换成后缀表达式
中缀表达式转换成后缀表达式
/* solution of convertion of infix to postfix */#include <stdio.h>#include <stdlib.h>#include <string.h>struct StackRecord{ char Operator[32]; int TopIndex; int Capacity;};typedef struct StackRecord * Stack;Stack CreateStack(){ Stack S = malloc(sizeof(struct StackRecord)); S->TopIndex = -1; S->Capacity = 32;}inline int IsEmpty(Stack S){return S->TopIndex == -1;}inline int IsFull(Stack S){return S->TopIndex == 31;}void Push(Stack S,char Operator){ // assuming S is not NULL, hha S->Operator[++S->TopIndex] = Operator;}char Pop(Stack S){ if(IsEmpty(S)) return 0; return S->Operator[S->TopIndex--];}char Top(Stack S){ if(IsEmpty(S)) return 0; return S->Operator[S->TopIndex];}int GetOperatorClass(char Operator){ switch(Operator) { case ‘+‘: case ‘-‘: return 0; case ‘*‘: case ‘/‘: return 1; case ‘^‘: return 2; case ‘(‘: return 10; default: return -1; }}int IsOperator(char c){ switch(c) { case ‘+‘:case ‘-‘:case ‘*‘:case ‘/‘:case ‘(‘:case ‘)‘:case ‘^‘: return 1; default: return 0; }}void PrintStack(Stack S){ int i = 0; printf("Current Stack: "); for(; i <= S->TopIndex; ++i) printf("%c ", S->Operator[i]); printf("\n");}int main(){ char *infix = "a+b*c^h^i+(d*e+f)*g"; char postfix[128] = "\0"; int len = strlen(infix); int i = 0; Stack S = CreateStack(); char top; int j = 0; char curr; for(;i < len; ++i) { postfix[j] = ‘\0‘; printf("Current Output: %s\n",postfix); curr = infix[i]; if(IsOperator(curr)) { PrintStack(S); if (curr == ‘)‘) { while(‘(‘ != (top = Pop(S))) postfix[j++] = top; }else if(curr == ‘^‘) { top = Top(S); while(top != ‘^‘ && (GetOperatorClass(curr) <= GetOperatorClass(top)) && top != ‘(‘) { postfix[j++] = top; Pop(S); top = Top(S); } Push(S,curr); } else { { top = Top(S); while((GetOperatorClass(curr) <= GetOperatorClass(top)) && top != ‘(‘) { postfix[j++] = top; Pop(S); top = Top(S); } } Push(S,curr); } } else postfix[j++] = curr; } while((top = Pop(S)) != 0) postfix[j++] = top; postfix[j++] = ‘\0‘; printf("%s",postfix); return 0;}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。