第03章栈和队列讲述.ppt
文本预览下载声明
//---循环队列的基本操作的算法描述----- Status InitQueue (SqQueue Q) { // 构造一个空队列Q Q.base = (ElemType *) malloc (MAXQSIZE *sizeof (ElemType)); if (!Q.base) exit (OVERFLOW); //存储分配失败 Q.front = Q.rear = 0; return OK; } Status EnQueue (SqQueue Q, ElemType e) { // 插入元素e为Q的新的队尾元素 if ((Q.rear+1) % MAXQSIZE == Q.front) return ERROR; //队列满 Q.base[Q.rear] = e; Q.rear = (Q.rear+1) % MAXQSIZE; return OK; } Status DeQueue (SqQueue Q, ElemType e) { // 若队列不空,则删除Q的队头元素, // 用e返回其值,并返回OK; 否则返回ERROR if (Q.front == Q.rear) return ERROR; e = Q.base[Q.front]; Q.front = (Q.front+1) % MAXQSIZE; return OK; } 讨论(本章小结) 线性表、栈与队的异同点 相同点: 逻辑结构相同,都是线性的; 都可以用顺序存储或链表存储; 栈和队列是两种特殊的线性表,即受限的线性表(只是对插入、删除运算加以限制)。 不同点: 运算规则不同,线性表为随机存取,而栈是只允许在一端进行插入和删除运算,因而是后进先出表LIFO;队列是只允许在一端进行插入、另一端进行删除运算,因而是先进先出表FIFO。 用途不同,线性表比较通用;堆栈用于函数调用、递归和简化设计等;队列用于离散事件模拟、多道作业处理和简化设计等。 * Stack为0 表示出错了, * * * 此处借用了Q.rear的指针,因为Q.rear没用了 把队列从头开始全部取出,一个个结点的释放 * 表达式求值是程序设计语言编译中的一个最基本问题,它的实现是栈应用的又一个典型例子。这里介绍一种简单直观、广为使用的算法,通常称为“算符优先法”。要把一个表达式翻译成正确求值的一个机器指令序列,或者直接对表达式求值,首先要能够正确解释表达式。 3.2.5 表达式求值 [例如],要对下面的算术表达式求值4+2 *3 -10/5首先要了解算术四则运算的规则。即:1)先乘除,后加减;2)从左算到右;3)先括号内,后括号外。由此,这个算术表达式的计算顺序应为: 4 + 2 * 3 - 10/ 5 = 4 + 6 - 10/5 = 10 - 10/5 = 10 – 2 = 8 算符优先法就是根据这个运算优先关系的规定来实现对表达式的编译或解释执行的。 任何一个表达式都是由操作数(operand)、运算符(operator)和界限符(delimiter)组成的,我们称它们为单词。 操作数既可以是常数也可以是被说明为变量或常量的标识符 运算符可以分为算术运算符、关系运算符和逻辑运算符等; 基本界限符有左右括号和表达式结束符等。 我们仅讨论简单算术表达式的求值问题,这种表达式只含加、减、乘、除等四种运算符。我们把运算符和界限符统称为算符,它们构成的集合命名为OP。根据上述三条运算规则,在运算的每一步中,任意两个相继出现的算符op1和op2之间的优先关系至多是下面三种关系之一: op1op2,op1的优先权低于op2 op1=op2,op1的优先权等于op2 op1op2,op1的优先权高于op2 由规则3),+、- 、*和/为op1时的优先性均低于‘(’但高于“)”。由规则2),当op1=op2时,令op1op2,‘#’是表达式的结束符。 为了算法简洁,在表达式的最左边也虚设一个‘#’构成整个表达式的一对括号。‘)’与‘(’、‘#’与‘)’以及‘(’与‘#’之间无优先关系,这是因为表达式中不允许它们相继出现,一旦遇到这种情况,则可以认为出现了语法错误。 表中“(”=“)”表示当左右括号相遇时,括
显示全部