数据结构之队列

队列

队列是一种常用的数据结构,最基本的特点是先进先出。

1、什么是队列?

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。

队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表。

 

2、队列的作用(为什么要使用队列)

只要需要先进先出逻辑的地方就可以使用队列来存储数据,比如在实现数字滤波的时候可以使用队列来存储待处理的数据。

3、队列的分类与特点

大致有普通队列、循环队列、双端队列,这个分类并没有太大的意义。

4、基于链表的队列实现

4.1 队列的结构

链表的结构体含有两个指针,一个指向队头节点,一个指向队尾节点。节点的结构体包含一个数据和一个指针,指针指向下一个节点。

4.2 队列的基本操作

1、初始化

2、判断队列为空

3、进队列

4、出队列

5、查看队首元素

6、获取队列的大小

7、销毁队列

 

4.3 基于单向线性链表的队列的c语言实现

头文件

#ifndef QL_H
#define QL_H
//#include<sys/types.h>
#include<stdbool.h>

typedef struct QueueNode{
	int data;
	struct QueueNode* next;
} QUEUE_NODE;

typedef struct Queue{
	QUEUE_NODE* front; //out
	QUEUE_NODE* rear;  //in
} QUEUE;

/*init to a empty queue*/
void queue_init(QUEUE* queue);

/*free ram and recover to init*/
void queue_deinit(QUEUE* queue);

/*is empty?*/
bool queue_empty(QUEUE* queue);

/*push*/
void queue_push(QUEUE* queue,int data);

/*pop*/
int queue_pop(QUEUE* queue);

/*jusu see a see*/
int queue_front(QUEUE* queue);

/*how many members*/
int queue_size(QUEUE* queue);

#endif/*QL_H*/

C文件

#include "ql.h"
#include <stdlib.h>

static QUEUE_NODE* create_node(int data){
	QUEUE_NODE* node=malloc(sizeof(QUEUE_NODE));
	node->data=data;
	node->next=NULL;
	return node;
}

static QUEUE_NODE* destroy_node(QUEUE_NODE* node){
	QUEUE_NODE* next=node->next;
	free(node);
	return next;
}

/*init to a empty queue*/
void queue_init(QUEUE* queue){
	queue->front=NULL;
	queue->rear=NULL;
}

/*free ram and recover to init*/
void queue_deinit(QUEUE* queue){
	while(queue->front)
		queue->front=destroy_node(queue->front);
	queue->rear=NULL;
}

/*is empty?*/
bool queue_empty(QUEUE* queue){
	return !queue->front &&!queue->rear;
}

/*push*/
void queue_push(QUEUE* queue,int data){
	QUEUE_NODE* node=create_node(data);
	if(queue->rear)
		queue->rear->next=node;
	else
		queue->front=node;
	queue->rear=node;
}

/*pop*/
int queue_pop(QUEUE* queue){
	int data=queue->front->data;
	if(!(queue->front=destroy_node(queue->front)))
		queue->rear=NULL;
	return data;
}

/*jusu see a see*/
int queue_front(QUEUE* queue){
	return queue->front->data;
}

/*how many members*/
int queue_size(QUEUE* queue){
	int len=0;
	QUEUE_NODE* node=NULL;
	for(node=queue->front;node;node=node->next)
		++len;
	return len;
}

 

测试文件

#include <stdio.h>
#include "ql.h"

/*进队测试*/
void queue_push_test(QUEUE* queue) {
	queue_push(queue, 1);
	queue_push(queue, 2);
	queue_push(queue, 3);
	queue_push(queue, 4);
	queue_push(queue, 5);
	queue_push(queue, 6);
	queue_push(queue, 7);
	queue_push(queue, 8);
	queue_push(queue, 9);
}

/*出队测试*/
void queue_pop_test(QUEUE* queue) {
	int i;
	int size = queue_size(queue);
	for(i=0;i<size;i++)
	  printf("%d ", queue_pop(queue));
}


int main(void){
	QUEUE queue;
	queue_init(&queue);
	queue_push_test(&queue);
	queue_pop_test(&queue);
	queue_deinit(&queue);
	return 0;
}

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一朝英雄拔剑起

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

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

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

打赏作者

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

抵扣说明:

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

余额充值