第3章 栈和队列2队列.pptVIP

  • 5
  • 0
  • 约2.12千字
  • 约 14页
  • 2016-12-23 发布于重庆
  • 举报
数据结构讲义 第3章 栈和队列-队列 黄可坤 嘉应学院 1 队列的定义 队列(Queue)也是一种运算受限的线性表。它只允许在表的一端进行插入,而在另一端进行删除。允许删除的一端称为队头(front),允许插入的一端称为队尾(rear)。 队列的修改是依先进先出的原则进行的。 3 队列的顺序实现 4 链队列 链队列示意图 链队列的基本实现 线性表、栈与队的异同点 相同点:逻辑结构相同,都是线性的;都可以用顺序存储或链表存储;栈和队列是两种特殊的线性表,即受限的线性表(只是对插入、删除运算加以限制)。 不同点: ①运算规则不同,线性表为随机存取,而栈是只允许在一端进行插入和删除运算,因而是后进先出表LIFO;队列是只允许在一端进行插入、另一端进行删除运算,因而是先进先出表FIFO。 ②用途不同,线性表比较通用;堆栈用于函数调用、递归和简化设计等;队列用于离散事件模拟、多道作业处理和简化设计等。 作业4: 队列的应用 实验目的:掌握队列的基本结构和操作方法,并能利用其解决实际问题。 实验内容: 利用队列进行迷宫求解,即宽度优先搜索,最好能输出求得的具体路径。并分析对比用栈进行迷宫求解的异同。可进一步考虑寻找最短路径。 提示: 1 先实现队列的基本操作:初始化,入栈,出栈等。 可用循环队列或链队列实现。 2 参考利用栈进行迷宫求解的程序,把进栈换成入队,把出栈换成出队即可。 * * 2 队列的基本操作 1.初始化队列 InitQueue(Q) 将队列Q设置成一个空队列。 2.入队列 EnQueue(Q,X) 将元素X插入到队尾中,也称“进队” ,“插入”。 3.出队列 DeQueue(Q,e) 将队列Q的队头元素删除,并用e返回其值,也称“退队”、“删除”。 4.取队头元素 GetHead(Q,e) 得到队列Q的队头元素之值,并用e返回其值。 5.判队空 QueueEmpty(Q) 判断队列Q是否为空,若为空返回1,否则返回0。 #define MAXSIZE 100 typedef struct { ElemType data[MAXSIZE]; int front; int rear; }SqQueue; 在非空队列里,头指针始终指向队头元素,而尾指针始终指向队尾元素的下一位置。 顺序队列的操作演示flash 为充分利用向量空间,克服上述假上溢现象,可以将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量,存储在其中的队列称为循环队列(Circular Queue)。 循环队列中进行出队、入队操作时,头尾指针仍要加1,朝前移动。只不过当头尾指针指向向量上界(QueueSize-1)时,其加1操作的结果是指向向量的下界0。 循环队列的操作演示flash 0 1 2 3 4 5 rear front J5 J6 J7 0 1 2 3 4 5 rear front J4 J9 J8 J4 J5 J6 0 1 2 3 4 5 rear front 初始状态 J4,J5,J6出队 J7,J8,J9入队 队空:front==rear 队满:front==rear 队空、队满无法判断: 1.另外设一个标志以区别 2.少用一个元素空间: 队空:front==rear 队满:(rear+1)%M==front 队空:Q.front =Q. rear 队满: Q.front =(Q.rear + 1) % maxSize 入队: Q.rear = (Q.rear + 1) % maxSize 出队: Q.front = (front + 1) % maxSize; 求队长:(Q.rear-Q.front+maxSize)%maxSize 循环队列 1)进队列算法 (1)检查队列是否已满,若队满,则溢出错误; (2)将新元素赋给队尾指针所指单元; (3)将队尾指针后移一个位置(即加1)。 2)出队列算法 (1)检查队列是否为空,若队空,则下溢错误; (2)取队首元素的值。 (3)将队首指针后移一个位置(即加1)。 循环队列的基本运算实现 null *q q.front q.rear 非空队列 q.front q.rear null 空队列 *q 和顺序队列类似,我们也是将这两个指针封装在一起,将链队列的类型LinkQueue定义为一个结构类型: typedef struct queuenode{ ElemType data; struct queuenode *next; }QueueNode; typedef struct{

文档评论(0)

1亿VIP精品文档

相关文档