循环队列的基本运算实现
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2.入队列 EnQueue(&Q,X) 将元素X插入到队尾中,也称“进队” ,“插入”。 3.出队列 DeQueue(&Q,&e) 将队列Q的队头元素删除,并用e返回其值,也称“退队”、“删除”。 4.取队头元素 GetHead(Q,&e) 得到队列Q的队头元素之值,并用e返回其值。 5.判队空 QueueEmpty(Q)
不同点:
① 运算规则不同,线性表为随机存取,而栈是只允 许在一端进行插入和删除运算,因而是后进先出 表LIFO;队列是只允许在一端进行插入、另一端 进行删除运算,因而是先进先出表FIFO。
② 用途不同,线性表比较通用;堆栈用于函数调用、 递归和简化设计等;队列用于离散事件模拟、多 道作业处理和简化设计等。
判断队列Q是否为空,若为空返回1,否则返回0。
3.4.3 队列的顺序实现
#define MAXSIZE 100 typedef struct { ElemType data[MAXSIZE];
int front; int rear; }SqQueue;
在非空队列里,头指针始终指向队头元素,而尾指针 始终指向队尾元素的下一位置。
❖ 链队列示意图
*q q.front
null q.rear
非空队列
*q
q.front
q.rear
null
空队列
和顺序队列类似,我们也是将这两个指 针封装在一起,将链队列的类型 LinkQueue定义为一个结构类型:
typedef struct queuenode{ ElemType data; struct queuenode *next; }QueueNode;
3.4.1 队列的定义
队列(Queue)也是一种运算受限的线性 表。它只允许在表的一端进行插入,而 在另一端进行删除。允许删除的一端称 为队头(front),允许插入的一端称为队 尾(rear)。
队列的修改是依先进先出的原则进行的。
队列的基本运算
1.初始化队列 InitQueue(&Q) 将队列Q设置成一个空队列。
front
J6
J5
5 J7
4
0
3
1
J4 2 J8
J9
rear
循环队列
队空: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
顺序队列的操作演示flash
❖ 为充分利用向量空间,克服上述假上 溢现象,可以将向量空间想象为一个首 尾相接的圆环,并称这种向量为循环向 量,存储在其中的队列称为循环队列 (Circular Queue)。
❖ 循环队列中进行出队、入队操作时,头 尾指针仍要加1,朝前移动。只不过当 头尾指针指向向量上界(QueueSize-1) 时,其加1操作的结果是指向向量的下 界0。
循环队列的操作演示flash
队空:front==rear 队满:front==rear
初始状态
rear
J6
J5 5
4
0
J4
3
1
2
fቤተ መጻሕፍቲ ባይዱont
队空、队满无法判断:
1.另外设一个标志以区别 2.少用一个元素空间:
队空:front==rear 队满:(rear+1)%M==front
5
4
0
3
1
2
front rear
循环队列的基本运算实现
1)进队列算法 (1)检查队列是否已满,若队满,则溢出错误; (2)将新元素赋给队尾指针所指单元; (3)将队尾指针后移一个位置(即加1)。 2)出队列算法 (1)检查队列是否为空,若队空,则下溢错误; (2)取队首元素的值。 (3)将队首指针后移一个位置(即加1);
3.4.2 链队列
typedef struct{ QueueNode *front; QueueNode *rear;
}LinkQueue;
链队列的基本实现
队列的应用
➢ CPU资源的竞争问题。 ➢ 主机与外部设备之间速度不匹配的
问题。 ➢ 服务、排队问题
讨论(代本章小结)
线性表、栈与队的异同点
相同点:逻辑结构相同,都是线性的;都可以用顺 序存储或链表存储;栈和队列是两种特殊的线性 表,即受限的线性表(只是对插入、删除运算加 以限制)。
不同点:
① 运算规则不同,线性表为随机存取,而栈是只允 许在一端进行插入和删除运算,因而是后进先出 表LIFO;队列是只允许在一端进行插入、另一端 进行删除运算,因而是先进先出表FIFO。
② 用途不同,线性表比较通用;堆栈用于函数调用、 递归和简化设计等;队列用于离散事件模拟、多 道作业处理和简化设计等。
判断队列Q是否为空,若为空返回1,否则返回0。
3.4.3 队列的顺序实现
#define MAXSIZE 100 typedef struct { ElemType data[MAXSIZE];
int front; int rear; }SqQueue;
在非空队列里,头指针始终指向队头元素,而尾指针 始终指向队尾元素的下一位置。
❖ 链队列示意图
*q q.front
null q.rear
非空队列
*q
q.front
q.rear
null
空队列
和顺序队列类似,我们也是将这两个指 针封装在一起,将链队列的类型 LinkQueue定义为一个结构类型:
typedef struct queuenode{ ElemType data; struct queuenode *next; }QueueNode;
3.4.1 队列的定义
队列(Queue)也是一种运算受限的线性 表。它只允许在表的一端进行插入,而 在另一端进行删除。允许删除的一端称 为队头(front),允许插入的一端称为队 尾(rear)。
队列的修改是依先进先出的原则进行的。
队列的基本运算
1.初始化队列 InitQueue(&Q) 将队列Q设置成一个空队列。
front
J6
J5
5 J7
4
0
3
1
J4 2 J8
J9
rear
循环队列
队空: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
顺序队列的操作演示flash
❖ 为充分利用向量空间,克服上述假上 溢现象,可以将向量空间想象为一个首 尾相接的圆环,并称这种向量为循环向 量,存储在其中的队列称为循环队列 (Circular Queue)。
❖ 循环队列中进行出队、入队操作时,头 尾指针仍要加1,朝前移动。只不过当 头尾指针指向向量上界(QueueSize-1) 时,其加1操作的结果是指向向量的下 界0。
循环队列的操作演示flash
队空:front==rear 队满:front==rear
初始状态
rear
J6
J5 5
4
0
J4
3
1
2
fቤተ መጻሕፍቲ ባይዱont
队空、队满无法判断:
1.另外设一个标志以区别 2.少用一个元素空间:
队空:front==rear 队满:(rear+1)%M==front
5
4
0
3
1
2
front rear
循环队列的基本运算实现
1)进队列算法 (1)检查队列是否已满,若队满,则溢出错误; (2)将新元素赋给队尾指针所指单元; (3)将队尾指针后移一个位置(即加1)。 2)出队列算法 (1)检查队列是否为空,若队空,则下溢错误; (2)取队首元素的值。 (3)将队首指针后移一个位置(即加1);
3.4.2 链队列
typedef struct{ QueueNode *front; QueueNode *rear;
}LinkQueue;
链队列的基本实现
队列的应用
➢ CPU资源的竞争问题。 ➢ 主机与外部设备之间速度不匹配的
问题。 ➢ 服务、排队问题
讨论(代本章小结)
线性表、栈与队的异同点
相同点:逻辑结构相同,都是线性的;都可以用顺 序存储或链表存储;栈和队列是两种特殊的线性 表,即受限的线性表(只是对插入、删除运算加 以限制)。