ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

队列的顺序存储

2021-01-29 13:01:43  阅读:143  来源: 互联网

标签:队列 队头 int MaxSize front 顺序存储 rear


一、队列的定义:

队列是只允许在一端进行插入,另一端进行删除的线性表
特点:先入队的元素先出队,先进先出
队尾:允许插入的一端
队头:允许删除的一端

front 指向队头元素
rear 指向队尾元素的后一个元素(下一个应该插入的位置)
注意:具体题目中的rear 和 front 可能会跟上面不同,代码实现会有所区别

二、队列的顺序存储的实现

1.定义与初始化

#define MaxSize 10

typedef struct 
{
	int data[MaxSize];  //静态数组存放队列
	int front,rear;     //队头指针和队尾指针
}SqQueue;

void InitQueue(SqQueue &Q)
{   
	//初始化时 队头、队尾指针指向0
	Q.rear = Q.front = 0;
}

void testQueue()
{
	SqQueue Q;//声明一个队列(顺序存储)

	InitQueue(Q);
}

2.入队与出队

循环队列:将存储空间在逻辑上变成“环状”

//入队
bool EnQueue(SqQueue &Q,int x)
{
	if((Q.rear+1)%MaxSize == Q.front){  //队列已经满
		return false;
	}
	Q.data[Q.rear] = x;          //新元素插入队尾
	Q.rear = (Q.rear+1)%MaxSize;//队尾指针加1取模
	                           //将存储空间在逻辑上变成“环状”
}

//出队(删除一个队头元素,并用x返回)
bool DeQueue(SqQueue &Q,int &x)
{
	if(Q.rear==Q.front){
		return false;
	}
	x = Q.data[Q.front];
	Q.front=(Q.front+1)%MaxSize;
	return true;
}

3.判空和获取队头元素

//判空操作
bool QueueEmpty(SqQueue &Q)
{
	if(Q.rear==Q.front){
		return true;
	}else{
		return false;
	}
}
//获得队头元素的值 用x返回
bool GetHead(SqQueue &Q,int &x)
{
	if(Q.rear==Q.front){
		return false;
	}
	x = Q.data[Q.front];
	
	return true;
}

三、判断队满和队空

1.方案一(牺牲一个存储单元)

此时队满的情况下,会浪费一个存储空间,因为若继续存储,会使rear指向d,即rear == front,而这是判断队空的情况

#define MaxSize 10

typedef struct 
{
	int data[MaxSize];  //静态数组存放队列
	int front,rear;     //队头指针和队尾指针
}SqQueue

初始化时,让Q.rear = Q.front = 0;在这时堆满这里插入图片描述
队列已满的条件:队尾指针的再下一个位置是队头
(Q.rear+1)%MaxSize == Q.front
队列空的条件:Q.rear == Q.front
队列元素个数:(rear + MaxSize - front)%MaxSize

2.方案二(定义变量表示队列长度)

#define MaxSize 10

typedef struct 
{
	int data[MaxSize];  //静态数组存放队列
	int front,rear;     //队头指针和队尾指针
	int size;           //队列当前长度
	          
}SqQueue

初始化时,rear =front = 0;size = 0
在这里插入图片描述
队满条件:size == MaxSize;
队空条件:size == 0;

3.方案三(标记插入或删除操作)

#define MaxSize 10

typedef struct 
{
	int data[MaxSize];  //静态数组存放队列
	int front,rear;     //队头指针和队尾指针
	int tag;           //最近进行的是插入还是删除
	          
}SqQueue

初始化时,rear =front = 0;size = 0
删除时,tag = 0
插入时,tag = 1
在这里插入图片描述
队满条件:front == rear && tag== 1
队空条件:front == rear && tag == 0

标签:队列,队头,int,MaxSize,front,顺序存储,rear
来源: https://blog.csdn.net/weixin_49001854/article/details/113372589

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有