- 9
- 0
- 约1.18万字
- 约 61页
- 2018-06-03 发布于上海
- 举报
华东理工大学数据结构31
* } // if } // if } // else } while ( !StackEmpty(S) ); return (FALSE); } // MazePath 第31页/共61页 * 例五、 表达式求值 设运算规则为: .运算符的优先级为: (——*、/、%—— +、- —— ) .有括号出现时先算括号内的,后算括号外的,多层括号,由内向外进行; 第32页/共61页 * 表达式求值的规则: 设立运算符栈和操作数栈; 设表达式的结束符为“#”,予设运算符栈的栈底为“#” 若当前字符是操作数,则进操作数栈; 若当前运算符的优先数高于栈顶运算符,则进栈; 否则,退出栈顶运算符作相应运算; “(”对它之前后的运算符起隔离作用,“)”可视为自相应左括弧开始的表达式的结束符。 第33页/共61页 * 算法描述如下: OperandType EvaluateExpression() { // 算术表达式求值的算符优先算法。设OPTR和OPND // 分别为运算符栈和运算数栈,OP为运算符集合。 InitStack (OPTR); Push (OPTR, #); initStack (OPND); c = getchar(); while (c!= # || GetTop(OPTR)!= #) { if (!In(c, OP)) { Push((OPND, c); c = getchar(); } // 不是运算符则进栈 第34页/共61页 * else switch (precede(GetTop(OPTR), c) { case : // 栈顶元素优先权低 Push(OPTR, c); c = getchar(); break; case =: // 脱括号并接收下一字符 Pop(OPTR, x); c = getchar(); break; 第35页/共61页 * case # // 退栈并将运算结果入栈 Pop(OPTR, theta); Pop(OPND, b); Pop(OPND, a); Push(OPND, Operate(a, theta, b)); break; } // switch } // while return GetTop(OPND); } // EvaluateExpression 第36页/共61页 * 例六、实现递归 在高级语言编制的程序中,调用函数与被调用函数之间的链接和信息交换必须通过栈例进行。 当在一个函数的运行期间调用另一个函数时,在运行该被调用函数之前,需先完成三件事: 将所有的实在参数、返回地址等信息传递给被调用函数保存; 为被调用函数的局部变量分配存储区; 将控制转移到被调用函数的入口。 从被调用函数返回调用函数之前,应该完成: 保存被调函数的计算结果; 释放被调函数的数据区; 依照被调函数保存的返回地址将控制转移到调用函数。 第37页/共61页 * 递归函数的调用类似于多层函数的嵌套调用,只是调用单位和被调用单位是同一个函数而已。 多个函数嵌套调用的规则是:后调用先返回 此时的内存管理实行“栈式管理” 递归过程指向过程中占用的数据区,称为递归工作栈 每一层的递归参数合成一个记录,称为递归工作记录 栈顶记录指示当前层的执行情况,称为当前活动记录 栈顶指针, 称之为当前环境指针 第38页/共61页 * 例如: void hanoi (int n, char x, char y, char z) // 将塔座x上按直径由小到大且至上而下编号为1至n // 的n个圆盘按规则搬到塔座z上,y可用作辅助塔座。 1 { 2 if (n==1) 3 move(x, 1, z); // 将编号为1的圆盘从x移到z 4 else { 5 hanoi(n-1, x, z, y); // 将x上编号为1至n-1的圆 // 盘移到y, z作辅助塔 第39页/共61页 * 6 move(x, n, z); // 将编号为n的圆盘从x移到z 7 hanoi(n-1, y, x, z); // 将y上编号为1至n-1的圆盘 // 移到z, x作辅助塔 8 } 9 } 第40页/共61页 * 3.4 队列的类型定义 队列(Queue)是一种先进先出 (FIFO---First In First Out)的线性表:即插入在表一端进行,而删除在表的另一端进行,把允许插入的一端叫队尾(rear) ,把允许删除的一端叫队头(front)。 如所示是一个有5 个元素的队列。入队的顺序依次为a1、 a2 、a3 、a4 、 a5 ,出队时的顺序将依然是a1、 a2 、a3 、a4 、 a5 。 队列示意图 a1 a2 a3 a4 a5 入队 出队 第41
原创力文档

文档评论(0)