第三章栈和队列---重庆邮电大学计算机科学与技术学院.pptVIP

  • 1
  • 0
  • 约1.25万字
  • 约 81页
  • 2019-10-25 发布于安徽
  • 举报

第三章栈和队列---重庆邮电大学计算机科学与技术学院.ppt

Status InitQueue (LinkQueue Q) { // 构造一个空队列Q Q.front = Q.rear = new QNode; if (!Q.front) exit (OVERFLOW); //存储分配失败 Q.front-next = NULL; return OK; } Status EnQueue (LinkQueue Q, QElemType e) { // 插入元素e为Q的新的队尾元素 p = new QNode; if (!p) exit (OVERFLOW); //存储分配失败 p-data = e; p-next = NULL; Q.rear-next = p; Q.rear = p; return OK; } a1 ∧ an Q.front Q.rear ∧ e p Status DeQueue (LinkQueue Q, QElemType e) { // 若队列不空,则删除Q的队头元素, //用 e 返回其值,并返回OK;否则返回ERROR if (Q.front == Q.rear) return ERROR; p = Q.front-next; e = p-data; Q.front-next = p-next; delete (p); return OK; } if (Q.rear == p) Q.rear = Q.front; 循环队列——顺序映象 #define MAXQSIZE 100 //最大队列长度 typedef struct { QElemType *base; // 动态分配存储空间 int front; // 头指针,若队列不空, // 指向队列头元素 int rear; // 尾指针,若队列不空,指向 // 队列尾元素 的下一个位置 int queuesize; } SqQueue; 顺序队列—队列的顺序存储表示。用一组地址连续的存储单元依次存放从队列头到队列尾的元素,指针front和rear分别指示队头元素和队尾元素的位置。 插入新的队尾元素,尾指针增1,rear = rear + 1, 删除队头元素,头指针增1, front = front + 1, 因此,在非空队列中,头指针始终指向队列头元素,而尾指针始终指向队列尾元素的下一个位置。 队满时再进队将溢出 解决办法:将顺序队列臆造为一个环状的空间,形成循环(环形)队列 循环队列——顺序映象 队列的进队和出队 front rear 空队列 front rear A,B,C, D进队 A B C D front rear A,B出队 C D front rear E,F,G进队 C D E F G C D E F G front rear H进队,溢出 队空:Q.front=Q.rear 队满:Q.rear-Q.front=maxsize(求队长) 入队:新元素按 rear 指示位置加入,再将队尾指针加一 ,即 rear = rear + 1 出队:将front指示的元素取出,再将队头指针加一,即front = front + 1,。 非循环队列 和栈类似,队列中亦有上溢和下溢现象。此外,顺序队列中还存在“假上溢”现象。因为在入队和出队的操作中,头尾指针只增加不减小,致使被删除元素的空间永远无法重新利用。因此,尽管队列中实际的元素个数远远小于向量空间的规模,但也可能由于尾指针巳超出向量空间的上界而不能做入队操作。该现象称为假上溢。 为充分利用向量空间,克服上述假上溢现象,可以将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量,存储在其中的队列称为循环队列(Circular Queue)。在循环队列中进行出队、入队操作时,头尾指针仍要加1,朝前移动。只不过当头尾指针指向向量上界(QueueSize-1)时,其加1操作的结果是指向向量的下界0。 显然,因为循环队列元素的空间可以被利用,除非向量空间真的被队列元素全部占用,否则不会上溢。因此,除一些简单的应用外,真正实用的顺序队列是循环队列。 打开P64

文档评论(0)

1亿VIP精品文档

相关文档