return 0; }//返回算符位序
char precede(char Aop, char Bop) {
return Prior[ReturnOpOrd(Aop,OP)][ReturnOpOrd(Bop,OP)]; }//判断优先级
float EvaluateExpression(char* MyExpression) { //主函数 // 算术表达式求值的算符优先算法。
// 设OPTR和OPND分别为运算符栈和运算数栈,OP为运算符集合。 charstack OPTR; // 运算符栈,字符元素 intstack OPND; // 运算数栈,实数元素 char TempData[20]; float Data,a,b; char theta,*c,x,Dr[2]; InitStack (OPTR); Push (OPTR, '#'); InitStack (OPND); c = MyExpression;
strcpy(TempData,\把src所指由NULL结束的字符串复制到dest所指的数组中 TempData置0
while (*c!= '#' || GetTop(OPTR)!= '#') { if (!In(*c, OP)) {//不是运算符
Dr[0]=*c; Dr[1]='\\0';
strcat(TempData,Dr);//把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\\0')并添加'\\0'。 c++;
if(In(*c,OP)) {
Data=(float)atof(TempData); Push(OPND, Data);
strcpy(TempData,\清空TempData,最长位数不能超过20位
}
} else { // 不是运算符则进栈
switch (precede(GetTop(OPTR), *c)) {
16
case '<': // 栈顶元素优先权低 Push(OPTR, *c); c++; break;
case '=': // 脱括号并接收下一字符 Pop(OPTR, x); c++; break;
case '>': // 退栈并将运算结果入栈 Pop(OPTR, theta); Pop(OPND, b);
Pop(OPND, a); Push(OPND, Operate(a, theta, b)); break; } // switch } } // while
return GetTop(OPND); } // EvaluateExpression status main(){
float i=0;int j=0;char c; do{
printf(\,请输入算符表达式:(例如“3+2”,按E退出)\\n\char exp[50]; for(j=0;j<50;j++) {
c=getchar();//每次读取一个 if(c!=10) exp[j]=c; else
{if(exp[j-1]!='#')exp[j]='#';break;}//若忘记输入#则自动添加 }
if(exp[0]=='e'||exp[0]=='E')//程序出口 { getchar();break;}
17
i=EvaluateExpression(exp); printf(\}
while(2>1);//确保无限循环 } 截图:
图:
八.实验小结
通过这个实验,进一步了解了栈和队列的定义和特性,进一步学习
了符优先级 ,了解了用算符优先级对算术表达式的求解过程,
18
南昌大学实验报告
---(3)二叉树及其应用
学生姓名: 学 号: 专业班级:
实验类型:□ 验证 □ 综合 ■ 设计 □ 创新 实验日期: 2010-4-26 实验成绩:
一.实验目的
树是数据结构中应用极为广泛的非线性结构,本单元的实验达到熟悉二叉树的存储结构的特性,以及如何应用树结构解决具体问题。
二.问题描述
首先,掌握二叉树的各种存储结构和熟悉对二叉树的基本操作。其次,以二叉树表示算术表达式的基础上,设计一个十进制的四则运算的计算器。
如算术表达式:a+b*(c-d)-e/f
b
C
-
d
a
*
e
-
+
/
f
三.实验要求
1.如果利用完全二叉树的性质和二叉链表结构建立一棵二叉树,分别计算
1)统计叶子结点的个数; 2)求二叉树的深度。
2.十进制的四则运算的计算器可以接收用户来自键盘的输入; 3.由输入的表达式字符串动态生成算术表达式所对应的二叉树;
19
4.自动完成求值运算和输出结果。
四.实验环境
PC微机
DOS操作系统或 Windows 操作系统
Turbo C 程序集成环境或 Visual C++ 程序集成环境
五.实验步骤
1.根据二叉树的各种存储结构建立二叉树; 2.设计求叶子结点个数算法和树的深度算法;
3.根据表达式建立相应的二叉树,生成表达式树的模块; 4.根据表达式树,求出表达式值,生成求值模块; 5.程序运行效果,测试数据分析算法。
六.测试数据
1.输入数据:2.2*(3.1+1.20)-7.5/3 正确结果:6.96
2.输入数据:(1+2)*3+(5+6*7); 正确输出:56
七.实验结果 程序:#include
#include
bitree *create() {bitree*root,*s,*q[100]; int front=1,rear=0; char ch; root=NULL;
printf(\scanf(\while(ch!='#') {s=NULL; if(ch!=',')
{s=(bitree*)malloc(sizeof(bitree)); s->data=ch;
20