循环队列的进队算法c语言,循环队列的定义,入队算法,出队算法,遍历算法,及其代码实现-Go语言中文社区...

队列 的定义:

一种可以是实现“先进先出”的存储结构。数据的进出类似于排队购票。队只允许队尾一端(rear)添加,在另一端队头(front)删除。队有队头(front)和队尾(rear)两个指针。队头front指向第一个元素,队尾rear指向无实际意义的元素,即队列最后一个元素的下一位置。

//队列定义

typedef struct Queue

{

int *pBase;//数组基地址,数组的首地址

int front;//队头

int rear;//队尾巴

}QUEUE;

//创建一个队列,空间分配,保存6个整形元素。

void init (QUEUE *pQ)

{

pQ->pBase=(int*)malloc(sizeof(int)*6);//长度为6的数组

pQ->front=0;

pQ->rear=0;

}

队列的分类:

分为动态队列和静态队列两种。动态队列用链表实现。动态队列易于实现。静态队列用数组实现,静态队列通常都必须是循环队列。

静态队列为甚么必须是循环队列?

6c815cc3ea613eed83dac2135d7a6d45.png

62171870cfe8c2106eb4e44efdd85193.png

cc152cf2a75026550148fb2b76511fe5.png

数组实现静态队列,删除元素时候,每删除一位,front指针上移一位,浪费一个单位的数组空间。这种方式添加元素的时候rear上移一个,删除元素的时候front上移一个。总之都是上移。

b6558f695f5501233a9d8bc5ebb73822.png

当front或者rear指到最上面一个位置,再上移就移动到最下面一个位置。所以数组实现队列的时候必须是循环队列,传统方式实现不了。

2.循环队列需要几个参数来确定,及循环队列各个参数的含义

队列需要两个参数确定,front和rear.2个参数不同的场合有不同的含义,建议初学者先记住,然后慢慢体会。

队列初始化

Front和rear的值都是零

队列非空

Front 代表的是队列的第一个元素

Rear代表队列的最后一个有效元素的下一个元素

队列空

Front 和rear的值相等,但不一定是零。

2.循环队列入队伪算法讲解

52cdc1b6d10325d45d7e59a014ae1059.png

Rear=(rear+1)%数组的长度

//进队,队尾rear+1;

bool en_queue(QUEUE *pQ,int val)

{

if(full_queue(pQ))

{

return false;

}

else

{

pQ->pBase[pQ->rear]=val;

pQ->rear=(pQ->rear+1)%6;

}

}

循环队列出队伪算法讲解

a9a7e2c36a6fa2a45d9056cbb24ea425.png

Front=(front+1)%数组的长度

//出队,队头位置变为:(front+1)%6

bool out_queue(QUEUE *pQ,int *pVal)

{

if(emput_queue(pQ))

return false;

else

{   *pVal=pQ->pBase[pQ->front];

pQ->front=pQ->front+1;

return true;

}

}

4.判断循环队列是否已空

Front与rear的值相等,则该队列为空。

5.如何判断循环对了是否已满

预备知识 :由于是循环队列,front的值可能比rear大,可能比rear小,也能相等,两者没有规律。但是队首旋转的速度不能比队尾快。

2fafdc25f103320b7084b1403bc73662.png

当存放元素的数目等于数组的存储位置个数,则rear和front重合。分不清头和尾。

所以我们少用一个存储位置。

c语言伪算法表示是:

队列满的条件:if ((rear+1)%数组长度==front)已满

Else 不满

#include

#include

#include"stdbool.h"//解决不能使用bool

#include "malloc.h"

//队定义

typedef struct Queue

{

int *pBase;//数组基地址,数组的首地址

int front;//队头

int rear;//队尾巴

}QUEUE;

void init(QUEUE*);//创建循环队列

bool en_queue(QUEUE*,int ); //入队

void traverse_queue(QUEUE*);//遍历

bool emput_queue(QUEUE* );//队是否满

bool full_queue(QUEUE *);//对列是否空

bool out_queue(QUEUE *,int *);//出队

int main()

{

int Val;

QUEUE Q;

init(&Q);

en_queue(&Q,1);

en_queue(&Q,2);

en_queue(&Q,3);

en_queue(&Q,4);

en_queue(&Q,5);

traverse_queue(&Q );//遍历

if(out_queue(&Q ,&Val))

{

printf("出队成功,出队的元素是%dn",Val);

traverse_queue(&Q );//遍历

}

return 0;

}

//创建一个队列,空间分配,保存6个整形元素。

void init (QUEUE *pQ)

{

pQ->pBase=(int*)malloc(sizeof(int)*6);//长度为6的数组

pQ->front=0;

pQ->rear=0;

}

//判断循环队列是否满

bool full_queue(QUEUE *pQ)

{

if((pQ->rear+1)%6==pQ->front)

{

return true;

}

else

return false;

}

//进队,队尾rear+1;

bool en_queue(QUEUE *pQ,int val)

{

if(full_queue(pQ))

{

return false;

}

else

{

pQ->pBase[pQ->rear]=val;

pQ->rear=(pQ->rear+1)%6;

}

}

//利用中间变量,遍历队列

void traverse_queue(QUEUE *pQ)

{

printf("队列遍历结果如下n");

int i= pQ->front;

while(i!=pQ->rear)

{

printf("%d ",pQ->pBase[i]);

i=(i+1)%6;

}

printf("n");

return ;

}

bool emput_queue(QUEUE* pQ)

{

if(pQ->front==pQ->rear)

return true;

else

return false;

}

//出队,队头front+1

bool out_queue(QUEUE *pQ,int *pVal)

{

if(emput_queue(pQ))

return false;

else

{   *pVal=pQ->pBase[pQ->front];

pQ->front=(pQ->front+1)%6;

return true;

}

}

cab20b7c3630f64add0e1f986563204d.png

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

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

相关文章

java中paint方法和paintComponent方法的不同

/*1.由Component.java源代码中可以看见其中的paint()方法体是空的,在Container中重写了该方法,其子类Window等也重写了该方法2.由JComponent.java源代码中可以看见其中的paint()方法中调用paintComponent, paintChildren, paintBo…

java office文件加水印_文档预览加水印——或可一用的防泄密方式

给文件加水印是常见的一种宣示版权的方式。像Office、WPS都自带加水印功能,能够给文档加上"保密"、"严禁复制"这样的水印。在多可系统中,也有这么一个添加水印的功能。启用该功能后,在使用HTML5预览时,多可系…

android 获取apk资源,android-apk-parser

APK解析库用于读取/解析 packageName。versionName。versionCode信息的简单类,以及已经编译的androidsdk文件中的更多内容。通过解压 AndroidManifest.xml 文件并解码编译好的XML二进制文件来收集这里信息,就可以实现。我一直在用它来实现各种android工件…

apache license 2.0如何使用防止法律纠纷_go语言使用Swaggo详细教程

相信很多程序猿和我一样不喜欢写API文档。写代码多舒服,写文档不仅要花费大量的时间,有时候还不能做到面面具全。但API文档是必不可少的,相信其重要性就不用我说了,一份含糊的文档甚至能让前后端人员打起来。 而今天这篇博客介绍的…

静态代码块,构造代码块,局部代码块演示

public class Test{static int num;static int numObj;//记录有多少个对象产生!static{//静态代码块, 是用来给类进行初始化的!//num 10;num;num *12;//没有进入静态代码块之前,num的初始化值是0System.out.println(num);//main(…

android执行main函数,AndroidStudio执行main方法报错

问题:有时在开发中想直接写一个java文件来测试一些东西,但是AndroidStudio执行的时候会报错。代码信息:public class HelloWorld {public static void main(String[] args) {System.out.println("HelloWorld");}}报错信息12:04:41:…

模拟java.util.Collection一些简单的用法

/* 需求:模拟java.util.Collection一些简单的用法!注意:java虚拟机中并没有泛型类型的对象。泛型是通过编译器执行一个被称为类型擦除的前段转换来实现的。 1)用泛型的原生类型替代泛型。 原生类型是泛型中去掉尖括号及其中的类型…

hive 导出json格式 文件_Hive 系列 之 基本操作合集

下面是本课程概览:(1)hive系列之简介,安装,beeline和hiveserver2(2)hive系列之基本操作(3)hive系列之udf(4)hive系列之二级分区和动态分区&#x…

android开发自定义view倍丝曲线,从0到1Android自定义View(四)贝塞尔曲线

原标题:从0到1Android自定义View(四)贝塞尔曲线2017年安卓巴士全球开发者论坛-上海站作者本文由两点水投稿,博客地址:http://www.apkbus.com/myspaceblog-911082.html前言扯来扯去,前面三篇自定义 View 文章,终于扯完了…

如何保证对象的唯一性

/* 如何保证对象的唯一性:1.不允许其他程序用new来创建该类对象。2.在该类创建一个本类实例。3.对外提供一个方法让其他程序可以获取该对象的引用。 */ public class Test{public static void main(String[] args){//Subject sub Subject.oSub;//这种方法不可控&am…

ios kvo 要引入_腾讯社招iOS面试记录

毕业好几年了,上周发送了简历给腾讯,参加了腾讯面试。具体部门这边就不说了。这次面试还是收获到了很多。一面电话面试:面试官主要是针对iOS相关的基础问题。先简单自我介绍一下自己对mrc和arc的理解谈谈对自动释放池的理解自动释放池在mrc和…

动态设置html字号,动态设置html的font-size值 (适配文字大小)

PC端(function () {function setRootFontSize() {let rem, rootWidth;let rootHtml document.documentElement;//限制展现页面的最小宽度rootWidth rootHtml.clientWidth < 1366 ? 1366 : rootHtml.clientWidth;// 19.2 设计图尺寸宽 / 100( 设计图的rem 100 )rem roo…

一个小例子对多态简单的理解

class Parent{int age;String name;public Parent(String name, int age){this.name name;this.age age;}public void writeWay(){System.out.println("毛笔!");}}class Child extends Parent{int age;String name;//这里只说为了说明一个问题&#xff0c;其实完全…

运行shell脚本时怎么知道jdk路径_Shell写脚本关于ssh执行jar包,需要刷新JDK路径的问题...

比如脚本中下面这一段ssh $i "java -jar /applog/$PROJECT/$APPNAME --server.port$SERVER_PORT >/dev/null 2>&1 &"免密登录linux服务器&#xff0c;执行jar包&#xff0c;通过ssh执行java程序&#xff0c;涉及到一个找不到JDK路径的问题&#xff0c;…

html 中加号的表示方法,CSS的+(加号)选择器怎么用

在CSS中“”符号选择器用于选择紧跟在指定元素之后但不在特定元素内部的元素。下面本篇文章就来具体介绍一下&#xff0c;希望对大家有所帮助。“”符号选择器在CSS中“”符号选择器被称为相邻兄弟选择器&#xff0c;用于选取在同一父元素下的&#xff0c;紧跟指定元素之后的另…

poj 1724ROADS(bfs和dfs做法)

1 /*2 dfs比较好想&#xff0c;就是测试数据的问题&#xff0c;导致在遍历边的时候要倒着遍历才过&#xff01;3 */4 #include<iostream> 5 #include<cstdio>6 #include<cstring>7 #include<vector>8 #include<algorithm>9 #define Max 0x3f3f3f…

华为新系统 鸿蒙,旗舰CPU+鸿蒙OS!华为Mate家族重磅新品来袭

我们常说安卓平板的生态跟苹果iPad有很大差距&#xff0c;不论是应用质量还是原生系统支持&#xff0c;苹果都做的更好一些。可能也是因为这个原因&#xff0c;因此安卓平板&#xff0c;尤其是旗舰级别的平板至今除了三星之外&#xff0c;也就只有华为在做。作为安卓阵营两大厂…

mysql中用来取余数的函数是_MySQL常用函数-单行处理函数-字符串处理函数(更新中...)...

本篇文章用到的数据库表/* SQLyog Ultimate v12.09 (64 bit) MySQL - 5.7.23-log : Database - myemployees ********************************************************************* *//*!40101 SET NAMES utf8 */;/*!40101 SET SQL_MODE*/;/*!40014 SET OLD_UNIQUE_CHECKSUN…

HDU 1024Max Sum Plus Plus(最大m字段和)

/* 动态转移方程&#xff1a;dp[i][j]max(dp[i-1]a[i], max(dp[t][j-1])a[i]) (j-1<t<i) 表示的是前i个数j个字段和的最大值是多少&#xff01; */ 1 #include<iostream> 2 #include<cstdio>3 #include<cstring>4 #define N 10000 5 using nam…

html盒子模型页面居中,【静态页面架构】CSS之盒子模型

CSS架构盒子模型&#xff1b;以内容区(显示文本和图像)内边距(内容区至边距的距离)边距(内容区的边界)外边距(元素的边框之间的距离)1.边距&#xff1b;border属性&#xff1b;简写属性用来设置边距的上(top)右(right)下(bottom)左(left)。宽度&#xff0c;颜色和样式div{width…