什么是队列?
只允许在两端进行插入和删除操作的线性表,在队尾插入,在队头删除
插入的一端,被称为"队尾",删除的一端被称为"队头",在队列操作过程中,为了提高效率,以调整指针代替队列元素的移动,并将数组作为循环队列的操作空间。
特点:先进先出 FIFO
后进后出 LILO
顺序队列(又称循环队列)
逻辑结构: 线性结构
存储结构:顺序存储结构
SeQueue.c
/**
** Created by 24122 on 2022/4/24.
**/
#include <stdio.h>
#include <stdlib.h>
#include "SeQueue.h"
/**
* 1.创建一个空的顺序队列
*/
sequeue_t *CreateSeQueue(void)
{
sequeue_t *p = (sequeue_t *) malloc(sizeof (sequeue_t));
if(p==NULL)
{
printf("CreateSeQueue error!\n");
return NULL;
}
//初始化
p->front =p->rear =0;//为空
return p;
}
/**
* 2.入队
*/
int EnSeQueue(sequeue_t *p,datatype data)
{
if(SeQueueIsFull(p))
{
printf("queue full\n");
return -1;
}
p->data[p->rear]=data;
p->rear = (p->rear+1)%N;
return 0;
}
/**
* 3.判断队列是否满
*/
int SeQueueIsFull(sequeue_t *p)
{
return (p->rear+1)%N ==p->front;//1满
}
/**
* 4.出队
*/
datatype DeSeQueue(sequeue_t *p)
{
datatype data;
if (SeQueueIsEmpty(p))
{
printf("Queue Empty!\n");
return -1;
}
data = p->data[p->front];
p->front = (p->front + 1) % N;
return data;
}
/**
* 5判断是否为空
*/
int SeQueueIsEmpty(sequeue_t *p)
{
return p->front =p->rear;//1空
}
/**判断队列长度
* 6.
*/
int SeQueueLength(sequeue_t *p)
{
return (p->rear-p->front+N)%N;
}
/**
* 7.清空队列
*/
void SeQueueClear(sequeue_t *p)
{
p->rear =p->front=0;
}
/**
* 打印队列元素
*/
void PrintSeqCirQueue(sequeue_t *p)
{
int i = p->front;
if (p->front < p->rear)
{
for (; i < p->rear; i++)
{
printf("%-3d", p->data[i]);
}
}
else
{
for (i; i <p->rear + N; i++)
{
printf("%-3d", p->data[i]);
}
}
printf("\n");
}
SeQueue.h
/**
** Created by 24122 on 2022/4/24.
**/
#ifndef DATASTRUCTURE_SEQUEUE_H
#define DATASTRUCTURE_SEQUEUE_H
#define N 6
typedef int datatype;
typedef struct {
datatype data[N];
int front;//队头
int rear;//队尾
}sequeue_t;
/**
* 1.创建一个空的顺序队列
*/
sequeue_t *CreateSeQueue(void);
/**
* 2.入队
*/
int EnSeQueue(sequeue_t *p,datatype data);
/**
* 3.判断队列是否满
*/
int SeQueueIsFull(sequeue_t *p);
/**
* 4.出队
*/
datatype DeSeQueue(sequeue_t *p);
/**
* 5判断是否为空
*/
int SeQueueIsEmpty(sequeue_t *p);
/**判断队列长度
* 6.
*/
int SeQueueLength(sequeue_t *p);
/**
* 7.清空队列
*/
void SeQueueClear(sequeue_t *p);
void PrintSeqCirQueue(sequeue_t *p);
#endif //DATASTRUCTURE_SEQUEUE_H
main.c
/**
** Created by 24122 on 2022/4/24.
**/
#include <stdlib.h>
#include <stdio.h>
#include "SeQueue.h"
int main()
{
sequeue_t *p = CreateSeQueue();
for (int i = 0; i < 5; i++) {
EnSeQueue(p,i);
}
putchar(10);
PrintSeqCirQueue(p);
int j= SeQueueLength(p);
printf("length=%d\n",j);
while(!SeQueueIsEmpty(p)) {
printf("%d ",DeSeQueue(p));
}
putchar(10);
int k= SeQueueLength(p);
printf("length=%d\n",k);
SeQueueClear(p);
}