数据结构第2章剖析.ppt

数据结构第2章剖析

JYP 第2章 线性表 2.1 线性表与数组 2.2 多项式 2.2.1 多项式的表示 2.2.2 多项式相加 2.3 稀疏矩阵 2.3.1 稀疏矩阵的表示 2.3.2 稀疏矩阵的转置 2.4 字符串 2.4.1 字符串模式匹配的简单算法 2.4.2 字符串模式匹配的KMP算法 2.4.3 两个字符串的最长公共子序列 2.5 栈 2.6 队列 2.7 迷宫问题 2.8 表达式计算 2.8.2 后缀表示 2.8.3 将中缀转化为后缀 2.9 机场模拟 例如,将A * (B + C) * D转化为A B C + * D * 的过程为: 这时扫描到右括号,应退栈至相应的左括号,并删除这对括号,即: 可见: 根据优先级可以控制操作符的出栈。 左括号需要特 殊处理:入栈前其优先级最高,而一旦进入栈中,其优先级最低,除了对应的右括号外,任何其它操作符都不能使其出栈。 需为操作符建立两种优先级:栈内优先级(isp)和入栈优先级(icp)。 前面C++操作符的isp和icp就是给定的优先级。 假设isp(‘(’) = 8 (最低),icp(‘(’) = 0(最高),isp(‘#’) = 8。 由此可得操作符的出栈规则:只要操作符的栈内优先级高于等于(或在数字上小于等于)当前扫描的操作符的入栈优先级,该操作符应出栈。 void postfix(expression e) { // 输出中缀表达式e的后缀。假设e中最后一个符号是 ‘#’。 Stacktoken stack; // 初始化栈 token y; stack.Add(‘#’); // 便于边界控制 for (token x = NextToken(e); x != ‘#’; x = NextToken(e)) { // NextToken从e中提取下一个符号 if ( x是一个操作数) cout x; else if ( x == ‘)’) // 退栈直至遇到‘(’ for (y = *stack.Delete(y); y != ‘(’; y = *stack.Delete(y)) cout y; else { // x 是操作符 for (y=*stack.Delete(y);isp(y)=icp(x);y=*stack.Delete(y)) cout y; stack.Add(y); // 将前面最后出栈的y 重新入栈 stack.Add(x); // 将当前操作符入栈 } } while (!stack.IsEmpty( )) cout *stack.Delete(y); } // postfix结束 分析: 算法从左到右扫描e一遍,每个操作数耗时O(1)。每个操作符入栈出栈各一次,耗时O(1)。设n是表达式中符号个数,则算法的时间复杂性是O(n)。 计算机模拟(simulation): 用软件模仿另一个系统的行为。 将研究对象表示为数据结构,对象动作表示为对数据的操作,控制动作的规则转换为算法。 通过更改数据的值或改变算法设置,可以观察到计算机模拟的变化,从而使用户能够推导出关于实际系统行为的有用结论。 在计算机处理一个对象的动作期间,其它对象和动作需等待。 队列在计算机模拟中具有重要应用。 简单机场模拟: 只有一个跑道。 在每个时间单元,可起飞或降落一架飞机,但不可同时起降。 飞机准备降落或起飞的时间是随机的,在任一时间单元,跑道可能处于空闲、降落或起飞状态,并且可能有一些飞机在等待降落或起飞。 飞机在地上等待的代价比在空中等待的小,只有在没有飞机等待降落的情况下才允许飞机起飞。 当出现队列满的情况时,则拒绝为新到达的飞机服务。 需要两个队列landing和takeoff。 飞机可描述为: struct plane { int id; // 编号 int tm; // 到达队列时间 }; 飞机的动作为: enum action { ARRIVE, DEPART }; 模拟运行: 时间单元:1 — endtime,并产生关于机场行为的重要统计信息,如处理的飞机数量,平均等待时间,被拒绝服务飞机的数量等。 采用基于泊松分布的随机整数决定在每个时间单元有多少架新飞机需要降落或起飞。 假设在10个时间单元中到达的飞机数分别是:2,0,0,1,4,1,0,

文档评论(0)

1亿VIP精品文档

相关文档