中缀转后缀与任务调度算法:表达式计算与时间优化

需积分: 10 8 下载量 53 浏览量 更新于2024-07-23 收藏 390KB DOC 举报
本实验报告主要探讨了两个关键的IT领域话题:表达式求值和任务调度。首先,我们来看表达式求值部分。 1. 表达式求值技术: - **中缀表达式与前缀/后缀表达式转换**:实验关注中缀表达式(如11+22*(7-4)/3),这种表达式通常按照运算符优先级和括号规则进行计算。为了简化计算过程,实验涉及将中缀表达式转换为前缀(如+11/*22-743)和后缀(如2274-*3/11+)形式。后缀表达式(也称逆波兰表示法)避免了括号,计算时按照运算符出现的顺序进行。 - **求值算法设计**:利用栈(如`SqStack`结构体定义)实现表达式求值,其中栈用于存储操作数和运算符。中缀表达式会通过一系列步骤(如逆波兰算法,Shunting Yard算法)转换为后缀或前缀,然后逐个处理运算符和操作数,最终得到结果。 2. 任务调度: - **多任务操作系统中的调度问题**:在多用户多任务环境中,操作系统需要根据任务的特性来决定它们的执行顺序。这里设定只有一个CPU,任务需要的CPU运行时间已知,目标是找到一个执行顺序,使得所有任务的平均等待时间最短。 - **数据结构设计**:涉及到任务数据结构`struct P`,包含任务编号、提交时间、运行时间和优先级等信息。同时,`Record`结构体用于记录每个任务的运行情况,包括等待时间、开始时间、结束时间等。 - **调度算法设计**:尽管具体算法未详述,但可以推测可能基于贪心策略或动态规划,先考虑当前可用的CPU资源和任务的相对紧迫性,逐步决定每个任务的执行时间,以最小化总等待时间。 整个实验综合运用了数据结构(如栈)、算法设计以及操作系统原理,旨在提升学生对表达式处理和任务调度的理解,并锻炼他们实际编程的能力。通过这个实验,参与者不仅能学习如何高效地求解不同形式的表达式,还能掌握操作系统中的任务调度算法,这对于理解并开发高效能的软件系统至关重要。
2009-12-02 上传
作为结束符的中缀算术表达式已经保存在s1字符串中,转换后得到的后缀算术表达式拟存于s2字符串中。由中缀表达式转换为后缀表达式的规则可知:转换前后,表达式中的数值项的次序不变,而运算符的次序发生了变化,由处在两个运算对象的中间变为处在两个运算对象的后面,同时去掉了所有的括号。为了使转换正确,必须设定一个运算符栈,并在栈底放入一个特殊算符,假定为’@’字符,让它具有最低的运算符优先级,假定为数值0,此栈用来保存扫描中缀表达式得到的暂不能放入后缀表达式中的运算符,待它的两个运算对象都放入到后缀表达式以后,再令其出栈并写入到后缀表达式中。 把中缀表达式转换为后缀表达式算法的基本思路是从头到尾地扫描中缀表达式中的每个字符,对于不同类型的字符按不情况进行处理。 若遇到的是空格则认为是分隔符,不需要进行处理; 若遇到的是数字或小数点,则直接写入到s2中,并在每个数值的最后写入一个空格; 若遇到的是左括号,则应把它压入到运算符栈中,待以它开始的括号内的表达式转换完毕后再出栈; 若遇到的是右括号,则表明括号内的中缀表达式已经扫描完毕,把从栈底直到保存着的对应左括号之间的运算符依次退栈并写入s2串中; 若遇到的是运算符,当该运算符的优先级大于栈顶运算符的优先级(加减运算符的优先级设定为1,乘除运算符的优先级设定为2,在栈中保存的特殊运算符’@’和’(’的优先级设定为0)时,表明该运算符的后一个运算对象还没有被扫描并放入到s2串中,应把它暂存于运算符栈中,待它的后一个运算对象从s1串中读出并写入到s2串中后,再另其出栈并写入s2串中; 若遇到的运算符的优先级小于等于栈顶运算符的优先级,这表明栈顶运算符的两个运算对象已经被保存到s2串中,应将栈顶运算符退栈并写入到s2串中,对于新的栈顶运算符仍继续进行比较和处理,直到被处理的运算符的优先级大于栈顶运算符的优先级为止,然后另该运算符进栈即可。 按照以上过程扫描到中缀表达式结束符’@’时,把栈中剩余的运算符依次退栈并写入到后缀表达式中,再向s2写入表达式结束符’@’和字符串结束符’{ post.content} ’,整个转换过程就处理完毕,在s2中就得到了转换成的后缀表达式。