一、队列的顺序存储
#define MAXSIZE 100
typedef int ElementType;
typedef struct{ElementType Data[MAXSIZE];//用一维数组存放队列元素int front;//队头指针int rear;//队尾指针
}SqQueue;
-
front指针指向队头元素
-
rear指针指向队尾元素的下一个位置
-
空对时:rear==front
-
队列初始化:rear=front=0
-
入队:对未满时,先送值到队尾,再队尾指针加一
-
出队:对不为空时,先取队头元素,再队头指针加一
-
不能使用q.rear==MAXSIZE判断队满,因为出队的过程中,数组前面的部分会有空闲,这时候入队会有上溢出,但是是假溢出
循环队列
将队列从逻辑上造成一个环状,利用取余实现
- 初始(空队):q.front=q.rear=0
- 出队指针变化:q.front=(q.front+1)%MAXSIZE
- 入队指针变化:q.rear=(q.rear+1)%MAXSIZE
- 队列长度:[MAXSIZE-(q.front-q.rear)]%MAXSIZE
- 出队、入队:都按顺时针,都是指针加一
- 队满:
方式一:
牺牲一个存储的单元来区分空队、满队约定:当队头指针在队尾指针的下一个位置时,队满
队空: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
队列的链式存储结构
- 链队本质上是一个同时带有队头指针、队尾指针的单链表
- 头指针指向队头结点
- 尾指针指向队尾结点
- 链式队列适合于数据元素变化较大的情形,不存在上溢
- 当使用多个队列时,最好使用链式队列,可以避免存储分配不合理下的溢出问题
//链式队列的结点
typedef struct LinkNode{ElementType data;//数据域struct LinkNode *next;//指针域,指向下一个结点
}LinkNode;
//链式队列
typedef struct{LinkNode *front;//队列的队头指针LinkNode *rear;//队列的队尾指针
}LinkQueue;