队列
队列是一种常用的数据结构,最基本的特点是先进先出。
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;
}