后缀表达式求值
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、设计思想
首先,将中缀表达式转换为后缀表达式。转换算法思路:设中缀表达式已存入数组E[n];由于后缀表达式中操作数的次序与中缀表达式一致,故扫描到中缀表达式操作数时直接输出到B[n]即可;对于运算符,视其优先级别,优先级高的运算符先输出;设一存放运算符的栈s,先将s置空;依次扫描E[n]中各分量E[i]送x:
若x=“”(结束符),依次输出栈s中运算符,转换结束;
若x=操作数,直接输出x到B[n]中;
若x=‘)’,反复退栈输出栈s中子表达式运算符,直到栈顶符=‘(’,并退掉栈顶的‘(’;
若x=操作符,反复退栈输出栈s中运算符,直到栈顶符 然后,对后缀表达式求值:定义一个栈s,用来存放后缀表达式的中间计算结果和操作数。设B[n]存放后缀表达式,栈s存放操作数,依次扫描B[n]中各分量B[i]送x:若x=操作数,直接进栈; 若x=运算符,出栈:b=pop(s),a=pop(s),做a、b关于x的运算,结果在进栈; 若x=“”,算法结束,输出栈顶,即表达式的结果。 二、算法流程图 后缀表达式求值算法流程图简单说明: 先将中缀表达式转换为后缀表达式:如果是数字,则直接进入后缀表达式数组,如果是操作符,比较操作符跟栈顶元素的优先级,如果大于栈顶,则直接入后缀表达式数组里,如果小于则将弹栈,直到栈顶元素的优先级小于读取的操作符。如果是(,直接进入栈,如果是),将弹栈,直到遇到(为止。 三、源代码 下面给出的是用后缀表达式求值算法实现的程序的源代码: #include #include #define MaxSize 50 struct { char data[MaxSize]; int top; } op;//定义栈; struct { float data[MaxSize]; int top; } st; //中缀转换为后缀 void trans(char*exp,char*postexp) { int i=0; op.top=-1; while(*exp!='\0') { switch(*exp) { case'(': op.top++;op.data[op.top]=*exp; exp++;break; case')': while(op.data[op.top]!='(') { postexp[i++]=op.data[op.top]; op.top--; } op.top--;exp++;break; case'+': case'-': while(op.top!=-1&&op.data[op.top]!='(') { postexp[i++]=op.data[op.top]; op.top--; } op.top++;op.data[op.top]=*exp;exp++;break; case'*': case'/': while(op.data[op.top]=='*'||op.data[op.top]=='/') { postexp[i++]=op.data[op.top]; op.top--; } op.top++;op.data[op.top]=*exp;exp++;break; case' ':break; default: while(*exp>='0'&&*exp<='9') { postexp[i++]=*exp; exp++; } postexp[i++]='#'; } } while(op.top!=-1) { postexp[i++]=op.data[op.top]; op.top--; } postexp[i]='\0'; } //进行运算 float compvalue(char*postexp) { float a,b,c,d; st.top=-1; while(*postexp!='\0') { switch(*postexp) { case'+': a=st.data[st.top]; st.top--; b=st.data[st.top]; st.top--; c=b+a; st.top++; st.data[st.top]=c; break; case'-': a=st.data[st.top]; st.top--; b=st.data[st.top]; st.top--; c=b-a; st.top++; st.data[st.top]=c; break; case'*': a=st.data[st.top]; st.top--; b=st.data[st.top]; st.top--; c=b*a; st.top++; st.data[st.top]=c; break; case'/': a=st.data[st.top]; st.top--; b=st.data[st.top]; st.top--; if(a!=0) { c=b/a; st.top++; st.data[st.top]=c; } else { printf("\n\t除零错误!\n"); } break; default: d=0; while(*postexp>='0'&&*postexp<='9') { d=10*d+*postexp-'0'; postexp++;