后缀表达式求值

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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++;

相关文档
最新文档