数据结构——队列

本文详细介绍了STL队列的基本操作,包括front()、back()、pop()、size()、empty()和swap()。同时,讲解了循环队列的存储结构、初始化、队列长度计算、入队、出队以及取队头元素的方法。此外,还展示了链队的实现,包括链队的初始化、入队、出队和取队头元素的操作。这些内容对于理解和使用C++中的队列数据结构至关重要。
摘要由CSDN通过智能技术生成

STL队列基本操作及含义

操作含义
front()返回队头元素
back()返回队尾元素
pop()队头弹出
size()返回队列大小
empty()判断队列是否为空
swap()交换队列元素

循环队列

(使用模运算代替单纯的加一)

存储结构

队头队尾指针为int,存放数组的为一个数组

#define MAXQSIZE 100;
typedef struct{
	QELemType *base;
	int front;
	int rear;
}SqQueue;

初始化

步骤:

  1. 动态申请指定大小的数组
  2. 首尾指针指向0
Status InitQueue(SqQueue &Q){
	Q.base=new QElemType[MAXQSIZE];
	if(!Q.base)
		exit(OVERFLOW);
	Q.front=Q.rear=0;
	return OK;
}

求队列长度

int QueueLength(SqQueue Q){
	return(Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
}

入队

步骤:

  1. 判断是否队满
  2. 将元素赋给队尾
  3. 队尾指针加一
Status EnQueue(SqQueue &Q,QElemType e){
	if((Q.rear+1)%MAXQSIZE==Q.front)
		return ERROR;
	Q.base[Q.rear]=e;
	Q.rear=(Q.rear+1)%MAXQSIZE;

出队

步骤:

  1. 判断是否队空
  2. 队头元素取值
  3. 队头指针加一
Status DeQueue(SqQueue &Q,QElemType &e){
	if(Q.rear==Q.front)
		return ERROR;
	e=Q.base[Q.front];
	Q.front=(Q.front+1)%MAXQSIZE;
	return OK;

取循环队列的队头元素

步骤:直接返回队头指针对应元素

SElemType GetHead(SqQueue Q){
	if(Q.front!=Q.rear)
		return Q.base[Q.front];

链队

存储结构

链表点结构+链表节点类型的前后指针

typedef struct QNode{
	QElemType data;
	struct QNode *next;
}QNode,*QueuePtr;
typedef struct{
	QueuePtr front;
	QueuePtr rear;
}LinkNode;

初始化

步骤:

  1. 创建一个新节点,头尾指针均指向该节点
  2. 头指针的next指向NULL
Status InitQueue(LinkNode &Q){
	Q.front=Q.rear=new QNode;
	Q.front->next=NULL;
	return OK;

入队

步骤:

  1. 创建新节点,对其赋值
  2. 队列尾指针指向新节点
  3. 新节点尾队列的尾指针
Status EnQueue(LinkQueue &Q,QElemType e){
	p=new QNode;
	p->data=e;
	p->next=NULL;
	Q.rear->next=p;
	Q.rear=p;
	return OK;
}

出队

步骤:

  1. 判断队列是否为空
  2. 保留队头节点用于内存释放
  3. 头指针指向下一个节点
  4. 判断出队元素是否为最后一个节点,是则Q.rear=Q.front
Status DeQueue(LinkQueue &Q,QElemType &e){
	if(Q.front==Q.rear)
		return ERROR;
	LinkQueue *p=Q.front->next;
	e=p->data;
	Q.front->next=p->next;
	if(Q.rear==p)//是否为最后一个节点
		Q.rear=Q.front;
	delete p;
	return OK;

取对头元素

步骤:

  1. 判断是否队空
  2. 存储队头节点,用于内存释放
  3. 取队头节点的值赋给e
  4. 判断出队元素是否为最后一个节点,是则Q.rear=Q.front
Status Dequeue(LinkQueue &Q,QElemType &e){
	if(Q.front==Q.rear)
		return ERROR;
	Queue *p=Q.front->next;
	e=Q.front->next->data;
	if(Q.rear==p)
		Q.front=Q.rear;
	delete p;
	return OK;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值