将后缀表达式exp转换为postexp的过程如下:
while(从exp读取字符ch,ch!='\0')
{
若ch为数字,将后继的数字都一次存放到postexp中,并以字符'#'标志数值串的结束;
若ch为左括号“(”,将此括号进栈到运算符栈op中;
若ch为右括号“)”,将运算符栈op依次出栈,直到“(”,并将“(”也出栈;
若ch为运算符,优先级不大于运算符op的栈顶运算符(除栈顶运算符为“(”外)的优先级,则依次出栈并存入到postexp中,然后将ch进栈
}
若中缀表达式exp扫描完毕,将运算符栈op中的所有运算符依次出栈并存放到postexp中,就得到了后缀表达式。
完整代码:
#include <stdio.h> #define MAXSIZE 50 typedef char elemType; //运算符栈 typedef struct{ elemType data[MAXSIZE]; int top; }OP; OP op; //中缀表达式转为后缀表达式 void trans(char exp[],char postexp[]){ op.top=-1; int i=0,j=0; char ch=exp[i]; while(ch!='\0'){ switch(ch){ case '(':{ op.top++; op.data[op.top] = ch; break; } case ')':{ while(op.data[op.top]!='('){ postexp[j++]=op.data[op.top--]; } op.top--; //去除 '(' break; } case '+': case '-':{ while(op.top!=-1&&op.data[op.top]!='('){ postexp[j++]=op.data[op.top--]; } op.top++; op.data[op.top]=ch; break; } case '*': case '/':{ while(op.top!=-1&&(op.data[op.top]=='*'||op.data[op.top]=='/')){ postexp[j++]=op.data[op.top]; op.top--; } op.top++; op.data[op.top]=ch; break; } case ' ':break; default :{ while(ch>='0'&&ch<='9'){ postexp[j++]=ch; i++; ch=exp[i]; } i--; //不是数字 退后一个,用switch来进行判断 postexp[j++]='#'; //在数字结束后添加'#'以便区分 } } i++; ch=exp[i]; } while(op.top!=-1){ //将运算符栈中 postexp[j++]=op.data[op.top--]; } postexp[j]='\0'; }