队列的进本概念
概念:队列是一种先进先出的数据结构,他有两个开口
特点:队列先进先出 后进后出。 队头 出元素,队尾进元素
队列的顺序存储
思考:数组的首地址端做队头还是队尾
答:都一样,做对头 和队尾 差别不大 因为都需要移动大量元素
顺序存储的基础操作
顺序存储 队列的结构体
typedef struct Queue{
int data[MAX]; //顺序存储 数组模拟的队列
int size; //队列的大小 (队列中元素的个数)
}QUeue,*SeqQueue;
顺序存储 队列的初始化
SeqQueue int(){
SeqQUeue p=(Queue *)malloc(sizeof(QUeue));
if(p==NULL){
return NULL;
}
//初始化 队列
p->size=0;
for(int i=0;i<MAX;i++){
p->data[i]=0;
}
return p;
}
顺序存储 队列的入队
void push(SeqQueue p,int value){
if(p==NULL){
printf("队列元素已满");
return;
}
}
//插入元素
p->data[p->size]=value;
顺序存储 队列的出队
void push(SeqQueue p){
if(p==NULL){
return;
}
if(p->size==0){
printf("队列元素已空");
return;
}
for(int i=0;i<p->size-1;i++){
p->data[i]=p->data[i+1];
}
//改变元素个数
p->size--;
}
要记得,看到循环里边 有 i+1的时候,要改变 最终值
队列的链式存储
思考:链表的头结点 做队头还是队尾
最队头好,因为 头结点 端 进行删除方便,尾端 插入元素方便(尾插法)
链式存储的基础操作
链式存储队列的结构体
//结点结构体
struct Node
{
int data; //数据域
struct Node* next; //指针域
};
//队列的结构体
typedef struct LQueue
{
struct Node header; //头结点
int size; //队列大小
struct Node* pTail; //尾结点指针
}LQueue, *LinkQueue;
链式存储 队列的初始化
LinkQueue init_LinkQueue()
{
//创建队列结构体
struct LQueue* myQueue = (struct LQueue*)malloc(sizeof(struct LQueue));
if (myQueue == NULL)
{
return NULL;
}
//初始化队列
myQueue->size = 0;
myQueue->header.next = NULL;
myQueue->pTail = &myQueue->header;
return myQueue;
}
链式存储 队列的入队
void push_LinkQueue(LinkQueue queue, int data)
{
//本质 尾插
if (queue == NULL)
{
return;
}
//新结点
struct Node * newNode = (struct Node *)malloc(sizeof(struct Node));
if (!newNode)
{
return;
}
newNode->data = data;
//更新指针的指向
queue->pTail->next = newNode;
newNode->next = NULL;
queue->pTail = newNode;
//更新队列大小
queue->size++;
}
链式存储 队列的出队
void pop_LinkQueue(LinkQueue queue)
{
//本质 头删
if (queue == NULL)
{
return;
}
if (queue->size == 0)
{
printf("空队,无法出队\n");
return;
}
//记录第一个结点
struct Node* pFirst = queue->header.next;
//更新指针的指向
queue->header.next = pFirst->next;
//释放结点
if (pFirst != NULL)
{
free(pFirst);
}
//队列中只有一个结点的时候,再出队会影响尾指针,需要特判
if (queue->size == 1)
{
queue->pTail = &queue->header;
}
//队列大小更新
queue->size--;
}
循环队列
概念
将数组看成一个圆环状,当用到了数组最后的位置,再次利用数组的头部
这种队列也称为循环队列
循环队列对空和队满时的条件
//队满
front = (rear+1)%n; //front 头 rear 尾
//对空
front = rear; //头指针指向尾指针为空