数据结构(队列)

本文详细介绍了顺序存储结构的队列,包括队头和队尾指针的概念,以及如何进行入队和出队操作。讨论了循环队列的实现,通过取余运算避免假溢出,并探讨了三种判断队满的方法。此外,还提到了链式队列的优势,特别是在数据元素变化较大或多个队列使用时,链式队列能有效防止存储溢出问题。
摘要由CSDN通过智能技术生成

一、队列的顺序存储

#define MAXSIZE 100
typedef int ElementType;
typedef struct{
	ElementType Data[MAXSIZE];//用一维数组存放队列元素
	int front;//队头指针
	int rear;//队尾指针
}SqQueue;
  1. front指针指向队头元素

  2. rear指针指向队尾元素的下一个位置

  3. 空对时:rear==front

  4. 队列初始化:rear=front=0

  5. 入队:对未满时,先送值到队尾,再队尾指针加一

  6. 出队:对不为空时,先取队头元素,再队头指针加一

  7. 不能使用q.rear==MAXSIZE判断队满,因为出队的过程中,数组前面的部分会有空闲,这时候入队会有上溢出,但是是假溢出

循环队列
将队列从逻辑上造成一个环状,利用取余实现

  1. 初始(空队):q.front=q.rear=0
  2. 出队指针变化:q.front=(q.front+1)%MAXSIZE
  3. 入队指针变化:q.rear=(q.rear+1)%MAXSIZE
  4. 队列长度:[MAXSIZE-(q.front-q.rear)]%MAXSIZE
  5. 出队、入队:都按顺时针,都是指针加一
  6. 队满:
方式一:
牺牲一个存储的单元来区分空队、满队

约定:当队头指针在队尾指针的下一个位置时,队满
队空:q.front==q.rear
队满:(q.rear+1)%MAXSIZE==q.front
队列中的元素个数:(q.rear-q.front+MAXSIZE)%MAXSIZE
方式二:
在类型中新增一个数据成员,用于表示元素个数
队空:q.Size==0
队满:q.Size==q.MAXSIZE
方式三:
在类型中新增一个数据成员,用以区分对空、队满
队空:q.tag==0
队满:q.tag==1

队列的链式存储结构

  1. 链队本质上是一个同时带有队头指针、队尾指针的单链表
  2. 头指针指向队头结点
  3. 尾指针指向队尾结点
  4. 链式队列适合于数据元素变化较大的情形,不存在上溢
  5. 当使用多个队列时,最好使用链式队列,可以避免存储分配不合理下的溢出问题
//链式队列的结点
typedef struct LinkNode{
	ElementType data;//数据域
	struct LinkNode *next;//指针域,指向下一个结点
}LinkNode;
//链式队列
typedef struct{
	LinkNode *front;//队列的队头指针
	LinkNode *rear;//队列的队尾指针
}LinkQueue;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值