数据结构-队列

Posted yoshi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构-队列相关的知识,希望对你有一定的参考价值。

队列是一种基本的数据结构

基本概念

队列(Queue):具有一定操作约束的线性表

只能在一端插入,而在另一端删除
数据插入:入队列(AddQ)
数据删除:出队列(DeleteQ)
先进先出:First In First Out(FIFO)

抽象数据类型描述

类型名称:队列
数据对象集:一个有0个或多个元素的有穷线性表
操作集:长度为MaxSize的队列Q是Queue,队列元素item是ElementType类型

  • Queue CreateQueue(int MaxSize):生成长度为MaxSize的空队列
  • int IsFullQ(Queue Q):判断队列Q是否已满
  • void AddQ(Queue Q, ElementType item):将数据元素item插入队列Q中
  • int IsEmptyQ(Queue Q):判断队列Q是否已空
  • ElementType DeleteQ(Queue Q):删除队头数据元素并返回

顺序存储实现

队列的顺序存储结构通常由一个一维数组和一个记录队列头元素位置的变量front以及一个记录队列尾元素位置的变量rear组成。我们通常使用循环队列,即队列头尾相连,这样就不会造成空间浪费。

结构体定义
typedef int Position
struct QNode{
	ElementType *Data;
	Position Front,Rear;
	int MaxSize;
};
typedef struct QNode *Queue;
初始化队列
Queue CreateQueue(int MaxSize){
	Queue Q=(Queue)malloc(sizeof(struct QNode));
	Q->Data=(ElementType *)malloc(MaxSize*sizeof(ElementType));
	Q->Front=Q->Rear=0;
	Q->MaxSize=MaxSize;
	return Q;
}
是否满队列

Rear是队列尾的位置,Front是队列头的位置,但也有一种情况是Rear是队列尾再后一个的位置,Front是队列头的位置,这样的话程序略有不同。

bool IsFull(Queue Q){
	return ((Q->Rear+1)%Q->MaxSize==Q->Front);
}
入队
void AddQ(Queue Q, ElementType X){
	if(IsFull(Q))
		printf("队列满");
	else{
		Q->Rear=(Q->Rear+1)%Q->MaxSize;
		Q->Data[Q->Rear]=X;
	}
}
是否空队列
bool IsEmpty(Queue Q){
	return (Q->Front==Q->Rear);
}

具体实现的时候还要加一个flag变量,来确认是出队还是入队以判断是队列空还是满。

出队
ElementType DeleteQ(Queue Q){
	if(IsEmpty(Q)){
		printf("队列空");
		return ERROR;
	}
	else{
		ElementType X=Q->Data[Q->Front];
		Q->Front=(Q->Front+1)%MaxSize;
		return X;
	}
}

链式存储实现

队列的链式存储结构可以用一个单链表实现,插入和删除操作分别在链表的两端进行,front指向链表头,rear指向链表尾。

结构体定义
typedef struct Node *PtrToNode;
struct Node{		//队列中的结点
	ElementType Data;
	PtrToNode Next;
};
typedef PtrToNode Position;

struct QNode{
	Position Front,Rear;		//队列头尾指针
	int MaxSize;
};
typedef struct QNode *Queue;
初始化队列
Queue CreateQueue(int MaxSize){
	Queue Q=(Queue)malloc(sizeof(struct QNode));
	Q->Front=Q->Rear=NULL;
	Q->MaxSize=MaxSize;
	return Q:
}
是否空队列
bool IsEmpty(Queue Q){
	return (Q->Front==NULL);
}
入队
void AddQ(Queue Q, ElementType X){
	Position tmp=(PtrToNode)malloc(sizeof(struct Node));
	tmp->Data=X;
	tmp->Next=NULL;
	Q->Rear=tmp;
}
出队
ElementType DeleteQ(Queue Q){
	Position FrontCell;
	ElementType FrontElem;
	if(IsEmpty(Q)){
		printf("队列空");
		return ERROR;
	}
	else{
		FrontCell=Q->Front;
		if(Q->Front==Q->Rear)		//队列只有一个元素
			Q->Front=Q->Rear=NULL;
		else		//队列有多个元素
			Q->Front=Q->Front->Next;
		FrontElem=FrontCell->Data;
		free(FrontCell);
		return FrontElem;
	}
}





以上是关于数据结构-队列的主要内容,如果未能解决你的问题,请参考以下文章

perl中的队列

IPC System V 消息队列 - 发送一个数组块

JDK常用数据结构

完全下载文件时,将下载的文件从一个片段传递到另一个片段

RocketMQ - 如何用死信队列解决消费者异常

rabbitmq - 不会获取队列中的所有消息