中缀表达式转后缀表达式
2013-04-29 20:57
288 查看
中缀表达式和后缀表达式的定义,度娘。。。
/* 中缀表达式转换为后缀表达式 步骤如下: 开始扫描中缀表达式; 如果为数字时,加入后缀表达式; 如果为运算符: a. 若为 '(',入栈; b. 若为 ')',则依次把栈中的的运算符加入后缀表达式中,直到出现'(',从栈中删除'(' ; c. 若为 除括号外的其他运算符, 当其优先级高于栈顶运算符时,直接入栈。否则从栈顶开始, 依次弹出比当前处理的运算符优先级高和优先级相等的运算符,直到一个比它优先级低的或者遇到了一个左括号为止。 当扫描的中缀表达式结束时,栈中的的所有运算符出栈。 */ #include<stdio.h> #include<string.h> #define Stack_Size 50 #define M 50 typedef struct Node { char elem[Stack_Size]; int top; }SeqStack; void InitStack(SeqStack *S) { S->top=-1; } int Push(SeqStack *S,char x) { if(S->top==Stack_Size-1) return 0; S->top++; S->elem[S->top]=x; return 1; } char *Pop(SeqStack *S) { char *x; x=(SeqStack *)malloc(sizeof (struct Node)); if(S->top==-1) return 0; else { *x=S->elem[S->top]; S->top--; return *x; } return 0; } char *GetTop(SeqStack *S) { char *x; x=(SeqStack *)malloc(sizeof (struct Node)); if(S->top==-1) return -1; else { *x=S->elem[S->top]; return *x; } } int priority(char op) { if(op=='+'||op=='-') return 1; else if(op=='/'||op=='%') return 2; else if(op=='*') return 3; else if(op=='^') return 4; else return 0; } int compare(char ch1,char ch2) { if(priority(ch1)>priority(ch2)||priority(ch1)==priority(ch2)) return 2; else return 1; } void main() { int i=0,j=0,k=0,m=0; char str[M],hou[M],ch='@'; SeqStack *OPTR; InitStack(&OPTR); printf("请输入要转换的中缀表达式(以#结束):"); for(i=0;i<M;i++) { scanf("%c",&str[i]); if(str[i]=='#') break; } while(str[k]!='#') { if(str[k]>='0'&&str[k]<='9') //如果是数字或字母时进后缀表达式hou[M] { hou[m]=str[k]; m++; } else if(str[k]>='a'&&str[k]<='z') { hou[m]=str[k]; m++; } else if(str[k]>='A'&&str[k]<='Z') { hou[m]=str[k]; m++; } else if(str[k]=='(') //如果是左括号直接进操作符栈OPTR Push(&OPTR,str[k]); else if(str[k]==')') //如果是右括号,将与第一个左括号之间的操作符全部压入后缀表达式中,且左括号出栈 { while(1) { ch=Pop(&OPTR); if(ch=='(') break; hou[m]=ch; m++; } } else if(GetTop(&OPTR)==-1) //如果是运算符,但是栈顶元素为空时 Push(&OPTR,str[k]); else if(GetTop(&OPTR)=='(') //如果是运算符,但是栈顶元素为'('时 Push(&OPTR,str[k]); else switch(compare(str[k],GetTop(&OPTR))) { case 2:Push(&OPTR,str[k]); //如果优先级比栈顶运算符优先级高 直接入栈 break; case 1:while(compare(GetTop(&OPTR),str[k])!=1&&GetTop(&OPTR)!='(') { hou[m]=Pop(&OPTR); // 若为不是最高级的运算符,则将从栈顶到第一个优先级不大于它的运算符或 '('之间的运算符加入数栈中,该运算符再入栈; m++; } if(GetTop(&OPTR)=='(') Pop(&OPTR); Push(&OPTR,str[k]); break; } k++; } while(GetTop(&OPTR)!=-1) { hou[m]=Pop(&OPTR); m++; } printf("将该中缀表达式转换为后缀表达式为:"); for(i=0;i<m;i++) //输出该后缀表达式 printf("%c ",hou[i]); printf("\n"); }
相关文章推荐
- 中缀表达式转换为前缀及后缀表达式并求值【摘】
- 栈与队列(三)中缀表达式转后缀表达式
- 1003. 中缀表达式转后缀表达式
- 中缀表达式转后缀表达式算法及实现
- 中缀表达式转为后缀,前缀表达式的简单做法
- 中缀表达式转后缀表达式求值(栈的应用)
- 中缀表达式转换为后缀表达式(C)
- 中缀表达式转换成后缀表达式,进行简单表达式的计算
- java实现中缀表达式转后缀表达式并且计算
- 中缀表达式转后缀表达式与括号匹配
- 前缀表达式 | 中缀表达式 | 后缀表达式
- 关于后缀表达式的计算与中缀表达式转化为后缀表达式
- 利用数组栈将中缀表达式转换成后缀表达式
- 栈:中缀表达式改为后缀表达式
- java算术表达式求值-中缀表达式转后缀表达式
- 中缀表达式转换为后缀表达式
- 中缀表达式转后缀表达式(逆波兰表达式)
- 中缀表达式转化为后缀表达式
- 中缀表达式转换成后缀表达式的规则
- 中缀表达式转换成前缀表达式和后缀表达式的极其简单方法