线性表之队列(单向)

队列的定义

1.队列和栈一样,是一种操作受限制的线性表

2.只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,进行插入操作的端称为队尾,进行删除操作的端称为队头

3.队列中没有元素时,称为空队列
4.在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队

4.元素进队,rear自增1;元素出队,front增1。front指向当前队中队头元素的前一位置,当rear=MaxSize-1时队满

在这里插入图片描述

队列的种类(存储方式)

1.单向队列

·  顺序队列
·  链队列

2.循环队列(环形队列)

·  顺序队列
·  链队列

单向队列

1.顺序队列
一定要记住的几个操作:

队空条件front=rear
队满条件rear=MaxSize-1
元素e进队rear++;data【rear】=e
元素e出队front++;e=data【front】

1.创建队列

//线性表之顺序队列
#define MaxSize 10
typedef struct{
	int data[MaxSize];
	int front,rear;			//队首和队尾指针
}SqQueue;

2.初始化对列

void InitQueue(SqQueue* &q){
	q=(SqQueue*)malloc(sizeof(SqQueue));
	q->front=q->rear=-1;
}

3.元素进队操作

bool EnQueue(SqQueue* &q,int e){
	if(q->rear==MaxSize)return false;//判断队满
	q->rear++;
	q->data[q->rear]=e;
	return true;
}

4.元素出队操作

bool DeQueue(SqQueue* &q,int e){
	if(q->front==q->rear)return false;
	q->front++;
	e=q->data[q->front];
	return true;
}

对于rear==MaxSize-1作为队满判断条件的缺陷。当队满为真时,队中可能还存在空位置,下面循环队列会重点补充说明.

2.链式队列
一定要记住的几个操作:

队空条件front=NULL或rear=NULL或front=rear
队满条件

链式队列是队列的实现方式之一。链式队列内部使用带头结点的单向链表来实现。它的好处的是灵活,队列容量理论上是不受限制的。

1.单链表中数据节点类型

typedef struct QNode{
	int data;
	struct QNode* next;
}QNode;

2.链队头节点类型

typedef struct{
	QNode* front;		//指向单链表队头节点
	QNode* rear;		//指向单链表队尾节点
}LiQueue;

3.初始化链队

void InitQueue(LiQueue* &q){
	q=(LiQueue*)malloc(sizeof(LiQueue));
	q->front=NULL;
	q->rear=NULL;
}

4.销毁队列

void DestroyQueue(LiQueue* q){
	QNode *p=q->front,*r;
	if(p!=NULL){
		r=p->next;
		while(p!=NULL){
			free(p);
			p=r; r=p->next;
		}
	}
	free(p);free(q);
}

5.进队操作

void EnQueue(LiQueue* &q,int e){
	QNode* p;
	p=(QNode*)malloc(sizeof(QNode));
	p->data=e;
	p->next=NULL;
	if(q->rear==NULL)q->front=q->rear=p;	//链队为空
	else{
		q->rear->next=p;
		q->rear=p;
	}
}

6.出队操作

bool DeQueue(LiQueue* q,int e){
	QNode* t;
	if(q->rear==NULL)return false;
	t=q->front;
	if(q->front==q->rear)q->front=q->rear=NULL;
	else q->front=q->front->next;
	e=t->data;
	free(t);
	return true;
}

如果对于文章没有提及的观点、错误的地方、或者更好的方法、比较好的学习方法,欢迎在评论区留言~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值