大话数据结构之<队列>

引言:队列是一种先进先出(First In First Out, FIFO)的线性数据结构,只允许在队尾(rear)插入元素,在队头(front)删除元素。本章介绍队列,包括其实现。

**1.**队列的概念及结构

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出 FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头

**2.**队列的实现

队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数 组头上出数据,效率会比较低。

下面实现一个动态队列(链表)

cpp 复制代码
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>
//队列性质:先进先出 //

/*  1.队列初始化
    2.队列销毁
	3. 入对列
	4.出队列
	5.判空
	6.返回队列长度 
	7.返回队头数据
	8.返回队尾数据 
*/
//用单链表实现队列 
//使用两个结构体
//一个表示链表的节点的构成    
//一个用来描述队列 
typedef int  QDatatype;


//队列的节点 
typedef struct QueueNode
{
	struct QueueNode* next;
	QDatatype data;
}QNode;


//描述队列 
typedef struct Queue
{
	QNode* head;//队头位置 
	QNode* tail;//队尾位置 
	int size;//队列长度 
}Queue;


//判空 
bool QueueEmpty(Queue* pq)
{
	assert(pq);
	return pq->size == 0; 
}


//初始化 
void QueueInit(Queue* pq)
{
	assert(pq);
	pq->head = NULL;
	pq->tail = NULL;
	
	pq->size = 0;
}


//销毁队列 
void QueueDestroy(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));
	QNode* cur = pq->head;
	while(cur)
	{
	 	QNode* next = cur->next;
		 free(cur);
		 cur = NULL;
		 cur = next; 
	} 
	pq->head = pq->tail = NULL;
	pq->size = 0; 
	
}


//入队列 
void QueuePush(Queue* pq, QDatatype x)
{
	//创建新的节点 
	QNode* newnode =(QNode*)malloc(sizeof(QNode));
	if(newnode == NULL)
	{
		perror("malloc fail");
		return ;
	 } 
	 newnode->data = x;
	 newnode->next = NULL;
	 
	 if(pq->head==NULL)
	 {
	 	assert(pq->tail == NULL);
	 	pq->head = pq->tail = newnode; 
	 }
	 else
	 {
	 	pq->tail->next = newnode;
	 	pq->tail = newnode;
	 }
	
	pq->size++; 
}


//出队列 
void QueuePop(Queue* pq)
{
	assert(pq);
	assert(pq->head!=NULL);
    
    
    if(pq->head->next == NULL)
    {
       free(pq->head);
       pq->head = pq->tail = NULL; 
	}
    else
    {
    	QNode* next = pq->head->next;
    	free(pq->head);
    	pq->head = next;
	}
     
	pq->size--;
 } 
 
 
 //返回队列长度 
int QueueSize(Queue* pq)
{
	assert(pq);
	return pq->size;
}


//返回队头数据 
QDatatype QueueFront(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));
	return pq->head->data;
	
}


//返回队尾数据 
QDatatype QueueBack(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));
	return pq->tail->data;
}

//打印队列 
void QueuePrint(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));
	QNode* cur = pq->head;
	while(cur)
	{
	  QNode* next = cur->next;
	  printf("%d  ",cur->data);
	  cur =next;
	}
		
}



int  main()
{
	Queue pq;//定义一个队列
	
	//下面来实现一下队列的基本功能 
	//1.初始化
	 QueueInit(&pq);
	//2.向队列中放入数据//这里试放8个
	 QueuePush(&pq, 1);
	 //打印出来看一下 //1
	 printf("%d\n", QueueFront(&pq)); 
	//继续放 
	 QueuePush(&pq, 2);
	 QueuePush(&pq, 3);
	 QueuePush(&pq, 4);
	 QueuePush(&pq, 5);
	 QueuePush(&pq, 6);
	 QueuePush(&pq, 7);
	 QueuePush(&pq, 8);
	 
	 //这里我们可以再添加一个函数,用来打印整个对列
	 //便于我们观察整个队列的变化 
	 
	 QueuePrint(&pq); 
	 printf("\n");
	 //3.出队列 ,这里选择出四个数据 
	 QueuePop(&pq);
	 QueuePop(&pq);
	 QueuePop(&pq);
	 QueuePop(&pq);
	 //再观察队列里的数据
	 QueuePrint(&pq);
	 printf("\n");
	 
	  QueuePop(&pq);
	  //观察此时 队头,队尾数据和队列长度
	   // 6 8 3
	   printf("%d  ",QueueFront(&pq));
	   printf("%d  ",QueueBack(&pq));	   
	   printf("%d  ",QueueSize(&pq));	   
	   
	   
	   
	return 0;
 } 
相关推荐
柠檬07113 分钟前
matlab cell 数据转换及记录
算法
YuTaoShao29 分钟前
【LeetCode 每日一题】2221. 数组的三角和
数据结构·算法·leetcode
zzzsde34 分钟前
【c++】深入理解string类(3):典型OJ题
开发语言·c++
雨落在了我的手上39 分钟前
C语言趣味小游戏----猜数字小游戏
c语言·开发语言·游戏
大飞pkz39 分钟前
【设计模式】迭代器模式
开发语言·设计模式·c#·迭代器模式
little~钰41 分钟前
树上倍增和LCA算法---上
算法
MoRanzhi12031 小时前
2. Pandas 核心数据结构:Series 与 DataFrame
大数据·数据结构·人工智能·python·数据挖掘·数据分析·pandas
力扣蓝精灵1 小时前
今日分享 整数二分
算法
mc23561 小时前
5分钟学会微算法——Brian Kernighan 算法
算法
Excuse_lighttime1 小时前
除自身以外数组的乘积
java·数据结构·算法·leetcode·eclipse·动态规划