C语言数据结构与算法(二)
什么是队列
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
队列的特性
队列,顾名思义,就像排队买东西一样,排在前面买东西的买完走人,排在后面的要排着队等到买完东西再走人,也就是先进先出,后进后出的顺序
创建队列
要想创建一个栈,我们首先需要一个结构体,其中有
1、元素
2、对头
3、队尾
4、数量
5、容量
#define TYPE int
typedef struct Queue
{
TYPE* base;
int size; //容量
int head; //队头
int tall; //队尾
int cnt; //数量
}Queue;
然后是创建队列的函数
Queue* create_queue(int len)//创建
{
Queue* queue=malloc(sizeof(Queue));
queue->base = malooc(sizeof(TYPE)*len);
queue->len = len;
queue->head = 0;
queue->tall = -1;
queue->cnt = 0;//元素的数量
return queue;
}
对队列进行操作
判断队列满
队满的条件是队列里面的元素大于或等于队列的长度
bool full_queue(Queue* queue)//队满
{
if(queue->len <= queue->cnt)
return true;
return false;
}
判断队列空
判断队列是否为空就用cnt来进行判断
bool empty_queue(Queue* queue)//队空
{
if(0 == queue->cnt)
{
return true;
}
return false;
}
入队
对于队列来说,当入队入满,出队完之后,队头和队尾所指向的是队列的最后一个元素,怎么让它回头,回到最开始的地方是一个难点,在这里我用的是使用除余的方法
bool push_queue(Queue* queue, TYPE data)
{
//1.判断是否队满
//2.回头:指针指完最后一个又回到第一个
if(full_queue(queue)) return false;
queue->tall = (queue->tall+1) % queue->size;//%多少就是0-多少的数字,定义tall的初始值为-1,所以要+1
queue->base[queue->tall]=data;
queue->cnt++;
return true;
}
出队
与入队同理
bool pop_queue(Queue* queue)
{
if(empty_queue(queue)) return false;
queue->head = (queue->head+1) % queue->size;
queue->base[queue->heal]=data;
queue->cnt--;
return true;
}
队头元素
比较简单,不再细说
TYPE* head_queue(Queue* queue)
{
if(empty_queue(queue)) return NULL;
return queue->base+queue->head;
}
队尾元素
TYPE*tall_queue(Queue* queue)
{
if(empty_queue(queue)) return NULL;
return queue->base+queue->tall;
}