【数据结构与算法】队列(Queue)

往期相关文章推荐:
1.栈(Stack)之浅谈数组和链表实现栈各自的优缺点
2.线性表之链表(Linked List)
3.线性表之顺序表(Sequence List)

1. 队列介绍

  队列是一种特殊的线性表,只允许在队尾插入数据,在队头删除数据,和日常生活中的排队一样,因此队列具有先进先出FIFO(First In First Out)的特点。

队列可以用数组和链表的结构实现。使用链表的结构实现更优一些,入队列在链表尾端插入,出队列在头部删除,效率很高;如果使用数组的结构,出队列是在数组头上出数据,也就是删除数组第一个元素,效率会比较低,后面所有数据需要向前挪动。

在这里插入图片描述

2. 队列代码实现(C语言)

Queue.h

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>

typedef int valuetype;

typedef struct QueueNode {
	valuetype val;
	struct QueueNode* next;
} QueueNode;

typedef struct Queue {
	int size;
	QueueNode* front;
	QueueNode* rear;
} Queue;

void Init(Queue* queue);

void Push(Queue* queue, valuetype val);
void Pop(Queue* queue);

valuetype Front(Queue* queue);
valuetype Rear(Queue* queue);

int Size(Queue* queue);
bool Empty(Queue* queue);
void Destroy(Queue* queue);

Queue.c

#include "Queue.h"

void Init(Queue* queue) {
	assert(queue);
	queue->size = 0;
	queue->front = NULL;
	queue->rear = NULL;
}


void Push(Queue* queue, valuetype val) {
	assert(queue);
	QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));
	if (newnode == NULL) {
		perror("Push(Queue*, valuetype) malloc failed.");
		return;
	}
	newnode->val = val; newnode->next = NULL;
	if (queue->size == 0) {
		queue->front = queue->rear = newnode;
	}
	else {
		queue->rear->next = newnode;
		queue->rear = newnode;
	}
	queue->size++;
}

void Pop(Queue* queue) {
	assert(queue && queue->size > 0);
	QueueNode* newfront = queue->front->next;
	free(queue->front);
	queue->front = newfront;
	queue->size--;
	
	if (queue->size == 0) {
		queue->rear = NULL;
	}
}


valuetype Front(Queue* queue) {
	assert(queue && queue->size > 0);
	return queue->front->val;
}

valuetype Rear(Queue* queue) {
	assert(queue && queue->size > 0);
	return queue->rear->val;
}


int Size(Queue* queue) {
	assert(queue);
	return queue->size;
}

bool Empty(Queue* queue) {
	assert(queue);
	return queue->size == 0;
}

void Destroy(Queue* queue) {
	assert(queue);
	QueueNode* node = queue->front;
	while (node) {
		QueueNode* next = node->next;
		free(node);
		node = next;
	}
	queue->size = 0;
	queue->front = queue->rear = NULL;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

念来过倒字名qwq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值