1.3.2 线性表 - 队列

1 队列的定义

限定在表尾进行插入和在表头删除的操作的线性表,又称先进先出的线性表。
在这里插入图片描述

队列结点

struct queue_node {
	QNdatatype data;
	struct queue_node *next;
};

队列管理者

typedef struct{
	struct queue_node *front;
	struct queue_node *tail;
	int size;
}queueNode, *linkqueue;

2 队列操作的实现

2.1 初始化

// 初始化一个空队列
linkqueue init_queue(){
	linkqueue q = calloc(1, sizeof(queueNode)); // 分配一个空间
	if(q != NULL){
		q->tail = q->front = NULL;
		q->size = 0;
	}
	return q;
}

2.2 入队

在这里插入图片描述
思路:

  • 队列为空:队列管理者的对头和队尾指向新队尾
  • 队列不为空:
    原队尾指向新队尾
    队列管理者结尾指针指向新队尾
  • 队列大小+1
// 入队
void en_queue(struct queue_node *new, linkqueue q){
	// 判断是否空队列
	if (is_empty(q)){
		q->tail = q->front = new;
	}else{
		q->tail->next = new; // 原队尾指向新队尾
		q->tail = new; // 管理结尾指向新结尾
		}
	q->size++;
}

2.3 出队

在这里插入图片描述
思路

  • 队列为空:出队失败,返回NULL
  • 临时指针指向出队结点
  • 队列管理者对头更换
  • 出队结点不要乱指
  • 存放-1
// 出队
// 成功:返回出队指针
// 失败:返回NULL
struct queue_node *out_queue( linkqueue q ){
	// 判断是否为空
	if(is_empty(q)){
		printf("队列已空!");
		return NULL;
	}
	// 判断队列是否只剩一个
	if( q->size == 1){
		q->tail = NULL;
	}
	struct queue_node *tmp = q->front; // tmp指向出队结点
	q->front = tmp->next; // 管理者队头更换
	tmp->next = NULL; // 出队tmp不要乱指
	q->size--; // 栈的存放-1
	return tmp;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值