第3章 队列08.pptVIP

  • 2
  • 0
  • 约4.58千字
  • 约 45页
  • 2016-12-23 发布于重庆
  • 举报
软件基础(第3章 堆栈和队列) 软件基础讲义 电子工程系 链式队列存储结构的图示 队列的链式存储结构 12EF front 130A 12EF a1 1475 130A a2 10CB 1475 a3 ^ 10CB 10CB rear Qnode *front,*rear; Qltype *q; q-front,q-rear; 或者: Int initqueue(Qltype *q) {if ((q-front=(Qnode* )malloc(sizeof(Qnode)))==NULL) {printf(“\n申请空间失败!”); return 0;} q-rear=q-front; q-front-next=NULL; return 1; } 链队列的初始化 12EF front 12EF rear NULL * * 3.3 队列的概念及其算法 (Queue) 3.3.1队列的基本概念 3.3.2队列的顺序存储结构 3.3.3队列的链接存储结构 3.3.4队列的应用 1. 定义 队列:是只允许在一端删除,在另一端插入的线性表. 队头(front):允许删除的一端. 队尾(rear):允许插入的一端。 a2 … an-1 a1 a0 出队 入队 front rear 3.3.1.队列的定义与操作 2. 队列的基本操作 初始化 入队列 出队列 取对头元素 判队列是否非空 特性:先进先出(FIFO, First In First Out) 3.3.2.队列的顺序存储结构 a2 … an-1 a1 a0 出队 入队 front rear 1.顺序队列的c语言描述: elemtype queue[maxsize]; int front; int rear; 简单形式: typedef struct {elemtype queue[maxsize]; int front; int rear; }squeue; squeue *q; 结构体形式: front queue[maxsize] rear q q-rear q-front q-queue[0] q-queue[1] q-queue[2] … q-queue[maxlen-1] 借助C语言的算法描述使用的数据类型示意图 front rear 空队 a入队 b入队 队列入队过程 cd入队 4 3 2 1 0 4 3 2 1 0 a 4 3 2 1 0 b a 4 3 2 1 0 rear front front rear front rear a b d c 注意:入队时,front不变,rear变 g f e d c b a front rear 队满 g f e d c b front rear a出队 g f e d front rear bc出队 front rear defg出队 队列出队过程 注意:出队时,front变,rear不变 队空 进队时队尾指针先进一 rear = rear + 1, 再将新元素按 rear 指示位置加入。 出队时队头指针先进一 front = front + 1, 再将下标为 front 的元素取出。 队满时(rear =maxsize-1 )再进队将溢出出错; 队空时(rear = front )再出队将溢出出错。 front总是指向队列中第一个元素的前一个位置。 rear总是指向队列中最后元素的位置。 队列的状态 队空:条件front=rear 队满:条件rear=maxsize-1 上溢:队满时还要入队 下溢:队空时还要出队 提问:顺序队列是否会出现假队满??? 继而会出现假上溢??? 问题的提出: 初始状态 front rear b a 4 3 2 1 0 d c f入队 e入队 front rear 4 3 2 1 0 e b a d c a出队 front 4 3 2 1 0 e b a d c rear 4 3 2 1 0 front rear 队满! 上溢错 队空 入队 队满!上溢出错! 顺序队列的假溢出 rear rear a0 a1 a2 a3 rear rear rear maxlen个 front front rear a4 rear a5 front a6 rear 假溢出 如何防止和解决这个问题??? 这种现象称为假队满。 rear=maxsize-1. front≠-1 此时入队就会出现假上溢 方法1:尽可能设置较大的队列容量。 因估计不准而出错,且浪费空间。 方法2:修改出队列算法,每次出队移动剩余元素。 e d c b a front rear a出队 e d c b front rear 缺点:

文档评论(0)

1亿VIP精品文档

相关文档