数据结构表达式求值实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构表达式求值实验报告
一、设计人员相关信息
1. 设计者姓名、学号和班号:12地信李晓婧 12012242983
2. 设计日期:2014.
3. 上机环境:VC++6.0
二、程序设计相关信息
1(实验题目:用户输入一个包含+、-、*、/、正整数和圆括号的合法算术
表达式,计算该表达式的运算结果。

2(实验项目组成:先将算术表达式转换成后缀表达式,然后对改后缀表达
式求值。

3(实验项目的程序结构(程序中的函数调用关系图):
main
Leftpri
righpri
inop
precede
trans
compvalue
4(实验项目包含的各个文件中的函数的功能描述: , rightpri(char op) //求右运算符的优先级
, rightpri(char op) //求右运算符的优先级
, inop(char ch) //判断CH是否为运算符 , precede(char op1,char op2) //OP1和OP2运算符优先级的比较 , compvalue(char *postexp) //计算后缀表达式
5(算法描述或流程图:
#include<stdio.h>
#include<stdlib.h>
#define maxop 50
#define maxsize 50
struct
{ char ch;
int pri;
}lpri[]={{'=',0},{'(',1},{'*',5},{'/',5},{'+',3},{'-',3},{')',6}}, rpri[]={{'=',0},{'(',6},{'*',4},{'/',4},{'+',2},{'-',2},{')',1}};
int leftpri(char op) //求左运算符的优先级
{ int i;
for(i=0;i<maxop;i++)
if(lpri[i].ch==op)
return lpri[i].pri;
}
int rightpri(char op) //求右运算符的优先级
{ int i;
for(i=0;i<maxop;i++)
if(rpri[i].ch==op)
return rpri[i].pri;
}
int inop(char ch) //判断CH是否为运算符
{ if(ch=='('||ch==')'||ch=='+'||ch=='-'||ch=='*'||ch=='/') return true;
else
return false;
}
int precede(char op1,char op2) //OP1和OP2运算符优先级的比较{ if(leftpri(op1)==rightpri(op2))
return 0;
else if (leftpri(op1)<rightpri(op2))
return -1;
else
return 1;
}
void trans(char *exp,char postexp[])
{ struct
{char data[maxsize]; //存放运算符
int top; //栈指针
}op; //定义一个运算符
int i=0;
op.top=-1;
op.top++; //将=进栈
op.data[op.top]='='; while(*exp!='\0') //EXP表达式没扫描完时循环{ if(!inop(* exp)) {while(* exp>='0'&& * exp<='9') //判断为数字
{ postexp[i++]= * exp;
exp++;
}
postexp[i++]='#'; //用#表示一个数值串结束 }
else
switch(precede(op.data[op.top], * exp))
{
case -1: //栈顶运算符的优先级低
op.top++;op.data[op.top]= * exp;
exp++;
break;
case 0:
op.top--;
exp++;
break;
case 1: //退栈并输出到POSTEXP中
postexp[i++]=op.data[op.top];
op.top--;
break;
}
}
while (op.data[op.top]!='=')
{ postexp[i++]=op.data[op.top];
op.top--;
}
postexp[i]='\0';
}
float compvalue(char *postexp) //计算后缀表达式 { struct {float data[maxsize]; //存放数值
int top;
}st; //定义一个运算数栈 float d,a,b,c;
st.top=-1;
while(* postexp!='\0') //POSTEXP字符串未扫描时循环
{ switch(*postexp) {
case'+': //判定+
a=st.data[st.top];
st.top--; //退栈取数值A
b=st.data[st.top];
st.top--; //退栈取数值,
c=a+b; //计算C
st.top++;
st.data[st.top]=c;
break;
case'-': //判断-
a=st.data[st.top];
st.top--; //退栈取A
b=st.data[st.top];
st.top--; //退栈取B
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=a*b;
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");
exit(0); //异常退出
}
break;
default: //处理数字字符
{ d=0;
while(* postexp>='0'&& *postexp<='9') //判断为数字字符postexp++;
}
st.top++;
st.data[st.top]=d;
break;
}
postexp++; //继续处理其他字符)
}
return(st.data[st.top]); }
void main()
{ char exp[]="(50-20)/(4+2)";
char postexp[maxsize];
trans(exp,postexp);
printf("中缀表达式:%s\n",exp);
printf("后缀表达式:%s\n",postexp);
printf("表达式的值:%g\n",compvalue(postexp)); }
6(实验数据和实验结果:
7(出现的问题及解决方法: 问题1:
解决方法:
修改宏定义,将maxop的值改小。

问题2:
解决方法:多调试一下。

三、程序盘
提交的程序盘应包含全部的源程序清单和可执行文件。

相关文档
最新文档