队列,C语言实现

什么是队列?

上一篇文章写了什么是栈,用C语言实现了栈,既然说了栈,不说队列,感觉总是少了点什么,所以就顺手写一个队列,而且最近做项目也用到这个队列的代码。

栈的特点是先进后出,队列的特点是先进先出,从这个特点可以知道,队列是比较友好的,不像栈那样最开始进去排队的人,竟然是最后一个出来的。

640?wx_fmt=png

新建一个队列

因为我这个例程是使用链表实现队列的,所以新建一个队列,实际上就是开辟一个内存空间,用来存储队列的头部。跟栈一样,我们理解了建立一个队列就是需要建立一个头,开辟的这个空间,代表的是这个队列,就好比,你老爸就可以代表你们家庭,不管你家有多少人,有多少个小孩,你老爸始终都是这个家庭的户主。

640?wx_fmt=png
/*创建队列,外部释放内存*/	
QueueInfo_st *createQueue(void)	
{	QueueInfo_st *queue = (QueueInfo_st *)malloc(sizeof(QueueInfo_st));	if(NULL == queue)	{	printf("malloc failed\n");	return NULL;	}	queue->next = NULL;	return queue;	
}

向队列中插入数据

向队列插入数据,我做的有点麻烦,先是遍历链表,找到这个链表的尾部,然后再在链表的尾部插入数据,看文章的大神,有好的方法可以指出来,我觉得应该有更加优秀的方法的。

640?wx_fmt=png
/*入队列,0表示成,非0表示出错*/	
int queue_push(QueueInfo_st *s,ElementType value)	
{	/*用来保存尾部指针*/	QueueInfo_st *temp = (QueueInfo_st *)malloc(sizeof(QueueInfo_st));	if(NULL == temp)	{	printf("malloc failed\n");	return FAILURE;	}	/*找到链表的尾部*/	while(s->next != NULL)	{	s = s->next;	}	temp->value = value;	temp->next = s->next;	s->next = temp;	return SUCCESS;	
}

取出队列的数据

取出队列的数据,也就是把头部指向的下一个链表里面的数据给取出来,取出来要记得释放内存哈,这一步尤其重要。

640?wx_fmt=png
/*出队列*/	
int queue_pop(QueueInfo_st *s,ElementType *value)	
{	/*首先判断队列是否为空*/	if(queue_is_empty(s))	return FAILURE;	/*找出队列顶元素*/	*value = s->next->value;	/*保存等下需要free的指针*/	QueueInfo_st *temp = s->next;	/*更换队列顶的位置*/	s->next = s->next->next;	/*释放队列顶节点内存*/	if(temp!=NULL)/*先判断指针是否为空*/	free(temp);	temp = NULL;	return SUCCESS;	
}

源码例程

#include <stdio.h>	
#include <stdlib.h>	
#include <stdint.h>	
#include <stdbool.h>	typedef int32_t ElementType; /*队列元素类型*/	
#define SUCCESS 0	
#define FAILURE -1	/*定义队列结构*/	
typedef struct QueueInfo	
{	ElementType value; /*队列存储的数据*/	struct QueueInfo *next; /*指向队列的下一个元素*/	
}QueueInfo_st;	/*函数声明*/	
QueueInfo_st *createQueue(void);	
int queue_push(QueueInfo_st *s,ElementType value);	
int queue_pop(QueueInfo_st *s,ElementType *value);	
int queue_top(QueueInfo_st *s,ElementType *value);	
int queue_is_empty(QueueInfo_st *s);	/*创建队列,外部释放内存*/	
QueueInfo_st *createQueue(void)	
{	QueueInfo_st *queue = (QueueInfo_st *)malloc(sizeof(QueueInfo_st));	if(NULL == queue)	{	printf("malloc failed\n");	return NULL;	}	queue->next = NULL;	return queue;	
}	
/*入队列,0表示成,非0表示出错*/	
int queue_push(QueueInfo_st *s,ElementType value)	
{	/*用来保存尾部指针*/	QueueInfo_st *temp = (QueueInfo_st *)malloc(sizeof(QueueInfo_st));	if(NULL == temp)	{	printf("malloc failed\n");	return FAILURE;	}	/*找到链表的尾部*/	while(s->next != NULL)	{	s = s->next;	}	temp->value = value;	temp->next = s->next;	s->next = temp;	return SUCCESS;	
}	
/*出队列*/	
int queue_pop(QueueInfo_st *s,ElementType *value)	
{	/*首先判断队列是否为空*/	if(queue_is_empty(s))	return FAILURE;	/*找出队列顶元素*/	*value = s->next->value;	/*保存等下需要free的指针*/	QueueInfo_st *temp = s->next;	/*更换队列顶的位置*/	s->next = s->next->next;	/*释放队列顶节点内存*/	if(temp!=NULL)/*先判断指针是否为空*/	free(temp);	temp = NULL;	return SUCCESS;	
}	
/*访问队列顶元素*/	
int queue_top(QueueInfo_st *s,ElementType *value)	
{	/*首先判断队列是否为空*/	if(queue_is_empty(s))	{	return FAILURE;	}	*value = s->next->value;	return SUCCESS;	
}	
/*判断队列是否为空,空返回1,未空返回0*/	
int queue_is_empty(QueueInfo_st *s)	
{	/*队列顶指针为空,则队列为空*/	if(s->next == NULL)	{	printf("队列为空\n");	return true;	}	return false;	
}	int main(void)	
{	int i = 0;	int data = 0;	QueueInfo_st * queue;	queue = createQueue();	for(i = 0 ;i< 20;i++)	{	queue_push(queue,i);	}	for(i = 0;i<20;i++)	{	data = 0;	queue_pop(queue,&data);	printf("%d \n",data);	}	
}
640?wx_fmt=png

总结

队列是基本的数据结构,考试和笔试应该会经常遇到,希望大家在面试的时候,还是能随手就写出一个队列,秒杀其他同学,在实际项目中还需要了解环形队列,也是先进先出的队列,但是环形队列它还体现在环上,我们上面建立的队列是没有大小限制的,但是环形队列是有大小限制的,如果插入的数据大于环形队列的大小,就会把第一个数据给覆盖,或者插入失败,至于是什么逻辑,都是代码实现的,都要去看代码理解其中的原理。

附加题(使用C++实现栈)

关于这个附加题,我想起来我有一个邻居,他女儿现在是小学一年级,班里面的同学读书都非常厉害,如果考试考个90分以下的,基本就是班级里面的倒数了,现在的行业竞争非常激烈,小学也是一样,你们以为考试考100分就是第一名了吗?那么你就是真的想多了,考试考105分都是并列几个第一名的,所以我们这个题目也是一样,使用C++来实现一个栈,这个跟上一次的文章刚好呼应,体现了几个问题,一个是C 和C++的不同,通过面向对象的思想实现栈,代码会少很多,而且封装也很好。对于初学者也可以理解类的思想,构造函数和析构函数等等。

这个代码就无偿奉献给大家,希望这个附加题让大家比其他同学多5分。

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=jpeg
扫码或长按关注
回复「加群 」进入技术群聊

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/468254.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为hr,我尽力了

最近&#xff0c;一则新闻很火但是突然&#xff0c;又不火了&#xff0c;火于不火之间&#xff0c;时间有点短&#xff0c;其中猜测很大部分是gongguan原因以下为正文截图~以上为事件原文&#xff0c;这个是一个热点新闻&#xff0c;之前发了一个热点新闻&#xff0c;瞬间就火爆…

idea,eclipse创建多模块项目

新建一个maven项目 iead,新建是不选择archetype,新建好之后,pom中的 <packaging>pom</packaging>节点是默认的,如果不是要改成这这样子 然后选中这个项目,新建一个module,之后就和建立普通项目一样了. eclipse 是这样的 建一个普通的maven项目就可以了 这个是建好之…

python画图程序代码_少儿python编程(7)海龟画图(拓展1)

我们继续用Python的海龟库来画图吧&#xff01;上图是画一朵花的程序&#xff0c;重点是6-12行&#xff0c;使用了函数来定义drawleaf:每一掰叶子由两条弧线组成&#xff0c;每一条弧线重复画15次&#xff0c;每次前进5步&#xff0c;右转6度。看图形化代码就很清楚了&#xff…

opencv matlab三维点云,点云采样的三种方法 - 小白学视觉的个人空间 - OSCHINA - 中文开源技术交流社区...

点击上方“小白学视觉”&#xff0c;选择“星标”公众号重磅干货&#xff0c;第一时间送达编辑&#xff1a;3D视觉工坊本文由知乎作者GeometryHub授权转载&#xff0c;不得擅自二次转载。原文链接&#xff1a;https://zhuanlan.zhihu.com/p/86044055点云采样分类点云采样的方法…

C语言数组越界导致无限循环

大奖也是你们的&#xff0c;感谢支持&#xff0c;不喜欢的请轻拍。过年抽奖我还是很期待的&#xff0c;每年公司的年会抽奖的时候&#xff0c;我总是能小中一把&#xff0c;有一年我还中了个一等奖&#xff0c;不知道大家对一等奖什么概念&#xff0c;中一等奖的概率非常低&…

七月流水账

7.1-7.3 >< 7.4 看了一会儿李老大给的Caffe的教程 重配python qt vtk&#xff0c;大概是原来装了一个xxx&#xff08;忘记名字&#xff09;&#xff0c;然后位数有些不对&#xff0c;搞了好一阵 果然还是卸载重装好>< 然后又看了会儿Matlab神经网络工具箱怎么用 …

python绘制拟合回归散点图_机器学习之利用Python进行简单线性回归分析

前言&#xff1a;在利用机器学习方法进行数据分析时经常要了解变量的相关性&#xff0c;有时还需要对变量进行回归分析。本文首先对人工智能/机器学习/深度学习、相关分析/因果分析/回归分析等易混淆的概念进行区分&#xff0c;最后结合案例介绍如何利用Python进行简单线性回归…

十年经验教你如何学习嵌入式系统

一、如何学习嵌入式系统- - 嵌入式系统的概念着重理解“嵌入”的概念 &#xff0c;主要从三个方面上来理解。1、从硬件上&#xff0c;“嵌入”将基于CPU的处围器件&#xff0c;整合到CPU芯片内部&#xff0c;比如早期基于X86体系结构下的计算机&#xff0c;CPU只是有运算器和累…

php博客文章修改,wordpress博客如何快速修改文章阅读数

WordPress修改文章阅读次数可以通过插件来完成&#xff0c;下面我们以WP-PostViews插件演示如何修改文章阅读次数。WP-PostViews是一个非常常用的wordpress插件&#xff0c;主要用于文章阅读数访问量的统计&#xff0c;插件使用简单&#xff0c;直接安装启用即可&#xff0c;并…

ionic拍照,从相册选择功能

在介绍插件的使用之前&#xff0c;我们有必要先大致了解下插件的原理 一、插件工作原理分析 一个插件是如何正确地在IONIC框架下运行的呢? 前台的HTML/js代码又是如何与后面具体平台做数据交互的呢? 这个就需要对插件的工作原理及各个模块之间的流程关系有一个基本的了解。 为…

python爬虫爬图片教程_python爬虫实战之爬取京东商城实例教程

前言 本文主要介绍的是利用python爬取京东商城的方法&#xff0c;文中介绍的非常详细&#xff0c;下面话不多说了&#xff0c;来看看详细的介绍吧。 主要工具 scrapy BeautifulSoup requests 分析步骤 1、打开京东首页&#xff0c;输入裤子将会看到页面跳转到了这里&#xff0c…

安卓camera总体框架

今天是周五了&#xff0c;时间过得真快&#xff0c;通常这个时候&#xff0c;我都还沉醉了上班的状态中&#xff0c;说到上班&#xff0c;我是认真的&#xff0c;我非常喜欢上班&#xff0c;特别是今天&#xff0c;我会听到一声优美的声音&#xff0c;我的银行卡会多出一些钱&a…

matlab可以连接阻抗分析仪么,阻抗分析仪的工作原理与测试方法

阻抗分析仪和LCR表是非常通用的测量器件的电子仪器。根据阻抗范围和频率范围的不同&#xff0c;有一系列不同原理的仪器来满足测试要求&#xff0c;图1是不同阻抗范围和不同频率范围的阻抗测量方法。图1 阻抗测量方法图2是自动平衡电桥法的原理框图。通过精确测量加载到被测件D…

分享几个有意思的视频

最近微信加我的好友有点多&#xff0c;然后问问题的也不少&#xff0c;有的问题我不知道&#xff0c;有的问题我觉得百度一下应该很多答案&#xff0c;有的问题我觉得我可以知道&#xff0c;但是需要自己去寻找答案&#xff0c;也需要花费我一些时间&#xff0c;我有时候非常不…

php+redis+设置前缀,spring使用Redis自定义前缀后缀名(去掉SimpleKey []+自定义)

标签&#xff1a;spring中自动加上 SimpleKey [] 解决方案一、自定义后缀名1、定义类实现KeyGenerator接口MyKeyGeneratorpackage com.wbg.springRedis.service.impl;import org.springframework.cache.interceptor.KeyGenerator;import org.springframework.stereotype.Compon…

北京的林书豪,像一把小李飞刀

从《我要打篮球》节目开始&#xff0c;就一直在关注书豪的比赛&#xff0c;我喜欢书豪&#xff0c;书豪选择来CBA打球&#xff0c;也满足了很多球迷的愿望&#xff0c;近距离感受球星的那种状态&#xff0c;今天晚上&#xff0c;北京跟青岛的比赛&#xff0c;我是一分钟没有拉下…

I2C和SPI注定要打一架

最近微信群里好几天聊到I2C&#xff0c;既然说到了I2C&#xff0c;那就有必要说SPI&#xff0c;那就一起说了算了&#xff0c;大家有更好见解的&#xff0c;留言回复下&#xff0c;让更多的人知道你的观点。整理与网络&#xff0c;侵删I2C和SPI应该要打一架&#xff1f;现今&am…

第1章 ssh命令和SSH服务详解

基础服务类系列文章&#xff1a;http://www.cnblogs.com/f-ck-need-u/p/7048359.html 本文对SSH连接验证机制进行了非常详细的分析&#xff0c;还详细介绍了ssh客户端工具的各种功能&#xff0c;相信能让各位对ssh有个全方位较透彻的了解&#xff0c;而不是仅仅只会用它来连接远…

漫画:什么是区块链?

两年前&#xff0c;小灰以前写过一期关于区块链的漫画&#xff0c;可能很多新来的小伙伴还没有看过。最近趁着区块链重新成为热门话题&#xff0c;小灰把这篇漫画稍作修改&#xff0c;再次推送给大家。什么是区块链&#xff1f;区块链&#xff0c;英文 Blockchain&#xff0c;本…

php外卖系统源码单店,网上订餐系统 v3.1 单店版

系统以简单实用为主&#xff0c;系统的每一个功能都是实用的&#xff0c;像以很多网站为了好看把页面填的满满的&#xff0c;用户进来不知从何处操作起&#xff0c;我们的系统&#xff0c;一切了为了用户&#xff0c;为了网站经营者。我们所做的不仅仅是一个店铺展示系统&#…