您现在的位置是:首页 > 正文

顺序队列的基本操作实现

2024-01-30 21:09:08阅读 0

队列特点:先进先出的线性表。只能在表尾插入数据,表头删除数据。

顺序队列:由用数组作为队列的存储空间、队头和队尾的指针组成。

一般操作:创建、入队、出队、队空、队满

一直入队会导致队满然后出队导致队空,会造成假溢出,用循环队列解决。

循环队列的两个关键条件:

队空 front = rear 队满 (rear+1)%maxlen = front //有一个节点不放数据

队列的结构定义如下:

typedef int datatype;
#define MAXSIZE 8
typedef struct seqqueue{
	datatype data[MAXSIZE];
	int front,rear;
}seq_queue,*seq_pqueue;

队列的基本操作实现代码如下:

void init_seqqueue(seq_pqueue * Q)  //创建队列
{
	if((*Q = (seq_pqueue)malloc(sizeof(seq_queue))) == NULL)
	{
		printf("malloc failed!\n");
		return ;
	}
	(*Q)->front = (*Q)->rear = MAXSIZE-1;	 //循环队列
	//一般队列	(*Q)->front = (*Q)->rear = -1; 
}

bool is_full_seqqueue(seq_pqueue q)   //队满
{
	if((q->rear+1)%MAXSIZE == q->front)
		return true;
	else
		return false;
}

bool in_seqqueue(datatype data,seq_pqueue q) //入队
{
	if(is_full_seqqueue(q)){      //判断是否为满
		printf("queue is full\n");
		return false;
	}
	q->rear = (q->rear+1)%MAXSIZE;
	q->data[q->rear] = data;
	return true;	
}

bool is_empty_seqqueue(seq_pqueue q)   //队空
{
	if(q->rear == q->front)
		return true;
	else 
		return false;
}


bool out_seqqueue(seq_pqueue q,datatype *D)  //出队
{
	if(is_empty_seqqueue(q)){            //判断是否为空
		printf("队列已经空\n");
		return false;
	}
	q->front = (q->front+1)%MAXSIZE; //指针移动
	*D = q->data[q->front];
	
	return true;	
}

void show_seqqueue(seq_pqueue q) 
{
	int i;
	if(is_empty_seqqueue(q))
		return ;
	//循环队列的打印
	for(i =(q->front+1)%MAXSIZE; i!=(q->rear+1)%MAXSIZE; i=(i+1)%MAXSIZE)
	{
		printf("%d ",q->data[i]);
	}
	puts("");	
}

反思:

了解队列的特性,在使用常规队列的时候容易发生 假溢出,考虑使用循环队列。

循环队列需注意的两个关键点:队空 front = rear  队满:(rear+1)%maxlen = front 

打印循环队列时的 循环条件要注意,需要取余。

可以使用单链表或者循环链表来实现队列的功能特点。

网站文章

  • 电脑桌面计算机打开不显示硬盘信息,电脑加硬盘后不显示不出来怎么办

    1.给电脑添加了一个新硬盘,可是显示不出来怎么办1、在计算机上安装硬盘后,打开计算机,在计算机桌面上,选择我的计算机并右键单击“管理”进入计算机管理界面。2、选择“磁盘管理”,系统将弹出来检测新硬盘并...

    2024-01-30 21:09:00
  • 欢迎使用CSDN-markdown编辑器

    项目Properties -> Project Facets -> Runtime -> New -> Add a tomcat server ,JRE 选择 JRE1.8.0_XX.

    2024-01-30 21:08:31
  • LinkedBlockingQueue的put,take方法

    put操作:在LinkedBlockingQueue中有putlcok和takelock俩把锁,put操作使用putlock这把锁,利用lockInterruptibly方法加锁,该方法的作用为:如果...

    2024-01-30 21:08:18
  • 微信程序开发之微信接入

    微信程序开发之微信接入

    一、 微信公众号1、详情网址微信公众平台微信官方文档 | 微信开放文档微信公众平台接口调试工具几款免费内网穿透工具测评使用 - 哔哩哔哩2、使用测试号①、微信公众平台可以进行登录或注册:公众号分类:订...

    2024-01-30 21:07:50
  • 【调剂】211西南大学2020年计算机与信息科学学院硕士研究生招生调剂

    【调剂】211西南大学2020年计算机与信息科学学院硕士研究生招生调剂

    点击文末的阅读原文或者公众号界面左下角的调剂信息或者公众号回复“调剂”是计算机/软件等专业的所有调剂信息集合,会一直更新的。说 明:1.以上分数线为普通计划分数线,少数民族高层次...

    2024-01-30 21:07:41
  • C# 参数数组

    C# 参数数组

    查看更多:https://www.yuque.com/docs/share/87c9429c-30cb-4aae-9a44-70b3d0d48dcd

    2024-01-30 21:07:34
  • PCL arm linux 源码安装

    PCL arm linux 源码安装PCL(Point Cloud Library)点云库,计算机视觉在3D方面的地位相当于OpenCV。 由于PCL在Ubuntu的软件源中只有x86架构的包,所以arm下只能通过源码编译。 系统:Ubuntu14.04 LTS CPU:Tegra K1 (Arm Cortex-A15) 内存:2G ROM:16G 理论上arm linux通用。为了不麻

    2024-01-30 21:07:06
  • LeetCode N叉树的前序遍历(递归、递推)

    LeetCode N叉树的前序遍历(递归、递推)

    给定一个 N 叉树,返回其节点值的前序遍历。 例如,给定一个 3叉树 : 返回其前序遍历: [1,3,5,6,2,4]。 说明: 递归法很简单,你可以使用迭代法完成此题吗? 思路分析: 和二叉树的前序...

    2024-01-30 21:07:00
  • html点击下一步,PythonWebScraping,如何使用RequestsHTML库单击“下一步”

    我正在尝试使用python请求html模块从“https://fortune.com/global500/2019/search/”获取数据。我能够获得前100项(从第一页),因为该页启用了javas...

    2024-01-30 21:06:53
  • 常用的user-agent

    常用的user-agent

    常用的user-agent

    2024-01-30 21:06:47