一、什么是单向队列
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
而队列又有单向队列和双向队列两种,其中,单向队列的特点是,遵守“先进先出”的规则,每次在队列末尾添加元素,从队列头部取出元素。
二、单向队列的基本结构体
typedef struct Queue{
T *m_vect; //存储数据的内存空间
size_t cap; //总容量
size_t index; //队列头的下标位置
size_t size; //目前元素的个数
}Queue;
三、单向队列需要使用的头文件
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
四、单向队列的相关函数
void init(Queue *que,size_t cap);//初始化
bool isEmpty(Queue *que);//是否为空
bool isFull(Queue *que);//是否已满
size_t getCap(Queue *que);//队列最大长度
size_t getSize(Queue *que);//队列中元素的个数
void push(Queue *que,T data);//队列末尾添加一个元素
T pop(Queue *que);//取出队列首的元素
T peekFront(Queue *que);//查看队列首的元素
T peekTail(Queue *que);//查找队列尾的元素
void travel(Queue *que);//遍历队列中的元素
void clear(Queue *que);//清空队列中所有的元素
void destroy(Queue *que);//销毁
五、相关函数的实现
typedef int T;
//初始化
void init(Queue *que,size_t cap){
que->m_vect = calloc(cap,sizeof(T));
que->cap = cap;
que->index = 0;
que->size = 0;
}
//判断是否为空
bool isEmpty(Queue *que){
return que->size == 0;
}
//是否已满
bool isFull(Queue *que){
return que->size == que->cap;
}
//队列最大长度
size_t getCap(Queue *que){
return que->cap;
}
//队列中元素的个数
size_t getSize(Queue *que){
return que->size;
}
//队列末尾添加一个元素
void push(Queue *que,T data){
que->m_vect[(que->index+que->size)%que->cap] = data;
++que->size;
}
//取出队列首的元素
T pop(Queue *que){
T data = que->m_vect[que->index];
que->index = (que->index+1)%que->cap;
--que->size;
return data;
}
//查看队列首的元素
T peekFront(Queue *que){
return que->m_vect[que->index];
}
//查找队列尾的元素
T peekTail(Queue *que){
return que->m_vect[(que->index+que->size-1)%que->cap];
}
//遍历队列中的元素
void travel(Queue *que){
for(int i=0;i<que->size;i++){
printf("%d ",que->m_vect[(i+que->index)%que->cap]);
}
printf("\n");
}
//清空队列中所有的元素
void clear(Queue *que){
while(!isEmpty(que)){
pop(que);
}
//que->index = 0;
//que->size = 0;
}
//销毁
void destroy(Queue *que){
if(que->m_vect != NULL){
free(que->m_vect);
que->m_vect = NULL;
}
}
六、堆栈使用示例
int main(){
Queue que;
init(&que,5);
int i=0;
while(!isFull(&que)){
push(&que,i);
i++;
}
travel(&que);
while(!isEmpty(&que)){
printf("%d ",pop(&que));
}
printf("\n");
push(&que,10);
push(&que,20);
printf("%d ",pop(&que));
push(&que,30);
push(&que,40);
push(&que,50);
push(&que,60);
travel(&que);
printf("%d ",peekFront(&que));
printf("%d \n",peekTail(&que));
destroy(&que);
return 0;
}