数据结构与算法2 单向队列的实现

一、什么是单向队列

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(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;	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值