1、时间 2016.04.12一、问题描述1. 表达式求值问题表达式是数据运算的基本形式。人们的书写习惯是中缀式, 如:11+22*(7-4)/3。中缀式的计算按运算符的优先级及括号优先的原则,相同级别从左到右进行计算。表达式还有后缀式(如:22 7 4 - * 3 / 11 +)和前缀式(如:+11 / * 22 7 4 3)。后缀表达式和前缀表达式中没有括号,给计算带来方便。如后缀式计算时按运算符出现的先后进行计算。本设计的主要任务是进行表达式形式的转换及不同形式的表达式计算。2. 任务调度多用户多任务操作系统中,多个任务同时共享计算机系统资源。为了使多个任务均能够顺利执行,操作系统要按一定的
2、原则对它们进行调度,使它们按一定的次序进行。设只有一个CPU,现有多个任务,它们需要CPU 服务的时间已知。在下列假设下,按平均等待时间最短为原则,设计算法求出任务的执行顺序。忽略任务提交的时间差,即认为各任务同时提交。各任务不同时提交。二、数据结构设计1. 表达式求值:通过算符优先算法来进行表达式求值,为实现算符优先算法,可以使用两个工作栈,一个称为OPTR,用以寄存运算符;另一个称为OPND,用以寄存操作数或运算结果。声明操作数栈:typedef struct NumStack / number stack int *base; int *top; int stacksize; NumSt
3、ack;声明运算符栈:typedef struct SymStack / symbol stack char *base; char *top; SymStack;2. 任务调度:用结构体存储每个任务的任务顺序,需要时间,提交时间,开始时间,等待时间,结束时间struct task int order, need, t,start,wait,end; T100;三、算法设计1.表达式求值:Precede函数用以比较运算符的优先级,返回,= 或 = ; /优先级表格 for(i=0;i9;i+) if(Table0i=a) /纵坐标寻找 break; for(j=0;j=49&s=0) if(c
4、hch=0;t-) /打印输出前缀表达式 if(bt=1&bt=9)%d,bt); else %c /for.n/prefix将中缀表达式转换为后缀表达式:算法描述:将中缀表达式转换为等价的后缀表达式的过程要使用一个栈放“(”,具体可以按照下面的方式进行。1)从左到右一次扫描中缀表达式的每一个字符,如果是数字字符和圆点“.”则直接将它们写入后缀表达式中。2)如果遇到的是开括号“(”,则将它们压入一个操作符栈(不需要与栈顶操作符相比较),它表明一个新的计算层次的开始,在遇到和它匹配的闭括号“)”时,将栈中的元素弹出来并放入后缀表达式中,直到栈顶元素为“(”时,将栈顶元素“(”弹出(不需要加入后缀表达式),表明这一层括号内的操作处理完毕。3)如果遇到的是操作符,则将该操作符和操作符栈顶元素比较: i)当所遇到的操作符的优先级小于或等于栈顶元素的优先级时,则取 出栈顶元素放入后缀表达式,并弹出该栈顶元素,反复执行直到栈顶元素的优 先级小于当前操作符的优先级(或遇到(); ii)当所遇到的操作符的优先级大于栈顶元素的优先级的时则将它压入 栈中。4)重复上述步骤直到遇到中缀表达式的结束符标记“#”,弹出栈中的所有元素并放入后缀表达式中,转换结束char postfix(char *a) /此函数将中缀表达式转换为后缀表达式 int i=0, j=0; CharPush(R, whi