生活中有很多队列的影子,比如打饭排队,买火车票排队问题等,可以说与时间相关的问题,一般都会涉及到队列问题;从生活中,可以抽象出队列的概念,队列就是一个能够实现“先进先出”的存储结构。队列分为链式队列和静态队列;静态队列一般用数组来实现,但此时的队列必须是循环队列,否则会造成巨大的内存浪费;链式队列是用链表来实现队列的。这里讲的是循环队列,首先我们必须明白下面几个问题

一、循环队列的基础知识

1.循环队列需要几个参数来确定

循环队列需要2个参数,front和rear

2.循环队列各个参数的含义

(1)队列初始化时,front和rear值都为零;

(2)当队列不为空时,front指向队列的第一个元素,rear指向队列最后一个元素的下一个位置;

(3)当队列为空时,front与rear的值相等,但不一定为零;

3.循环队列入队的伪算法

(1)把值存在rear所在的位置;

(2)rear=(rear+1)%maxsize ,其中maxsize代表数组的长度;

4.循环队列出队的伪算法

(1)先保存出队的值;

(2)front=(front+1)%maxsize ,其中maxsize代表数组的长度;

5.如何判断循环队列是否为空

if(front==rear)

队列空;

else

队列不空;

6.如何判断循环队列是否为满

这个问题比较复杂,假设数组的存数空间为7,此时已经存放1,a,5,7,22,90六个元素了,如果在往数组中添加一个元素,则rear=front;此时,队列满与队列空的判断条件front=rear相同,这样的话我们就不能判断队列到底是空还是满了;

解决这个问题有两个办法:一是增加一个参数,用来记录数组中当前元素的个数;第二个办法是,少用一个存储空间,也就是数组的最后一个存数空间不用,当(rear+1)%maxsiz=front时,队列满;

/*!

* \file 循环队列.cpp

*

* \author ranjiewen

* \date 2017/02/25 20:23

*

* 循环队列用数组实现,达到内存利用好*/#include#include#include"malloc.h"

#define N 8typedefstructqueue

{int *pBase; //数组头指针

int front; //指向队列第一个元素

int rear; //指向队列的最后一个元素的下一个元素

intmaxsize;struct queue(){ pBase = nullptr, front = rear = maxsize = 0; }

}Queque,*LinkQueque;void CreateQueque(LinkQueque Q,intmaxsize);voidTraverseQueque(LinkQueque Q);boolFullQueque(LinkQueque Q);boolEmptyQueque(LinkQueque Q);bool EnQueque(LinkQueque Q, intval);bool DeQueque(LinkQueque Q,int *val);intmain()

{

Queque q;

LinkQueque Q=&q; //初始化变量

CreateQueque(Q, N);for (int i = 1; i <= 6;i++)

{

EnQueque(Q, i);

}

TraverseQueque(Q);

EnQueque(Q,10);if(FullQueque(Q))

{

TraverseQueque(Q);

printf("满队列...\n");

}int del_data=0;if (DeQueque(Q,&del_data))

{

printf("出队列成功,数值为:%d\n", del_data);

}

TraverseQueque(Q);return 0;

}void CreateQueque(LinkQueque Q, intmaxsize)

{

Q->pBase = (int*)malloc(sizeof(int)*maxsize);if (Q->pBase==nullptr)

{

printf("Memory allocation failure...");

exit(-1);

}

Q->front = 0; //初始化参数

Q->rear = 0;

Q->maxsize =maxsize;

}voidTraverseQueque(LinkQueque Q)

{int i = Q->front;

printf("队列中的元素为:\n");while (i%Q->maxsize!=Q->rear)

{

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

i=(i+1)%Q->maxsize;

}

printf("\n");

}boolFullQueque(LinkQueque Q)

{if (Q->front == (Q->rear + 1) % Q->maxsize) //判断循环链表是否满,留一个预留空间不用

{return true;

}else{return false;

}

}boolEmptyQueque(LinkQueque Q)

{if (Q->rear==Q->front)

{return true;

}else{return false;

}

}bool EnQueque(LinkQueque Q, intval)

{if(FullQueque(Q))

{return false;

}else{

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

Q->rear = (Q->rear + 1) % Q->maxsize;return true;

}

}bool DeQueque(LinkQueque Q, int *val)

{if(EmptyQueque(Q))

{return false;

}else{*val = Q->pBase[Q->front];

Q->front = (Q->front + 1) % Q->maxsize;return true;

}

}

测试结果:

java循环队列入队出队算法_循环队列实现相关推荐

  1. 顺序队和循环队列,队列篇(顺序队和循环队列入队出队操作)

    数据结构专升本学习,队列篇(顺序队和循环队列) 前言: 之前我们把栈学完了,比较简单,今天我们学习队列里面的顺序队和循环队列,说难不难,说简单不简单,我们需要认真学习,博主会尽力把原理和逻辑讲明白,不 ...

  2. redis + php 简单的 队列 入队-出队

    //入队 操作<?php //链接redis $redis = new Redis(); $redis->connect("127.0.0.1","6379& ...

  3. 以域变量rear和length分别指示循环队列中队尾元素的位置和内含元素的个数。给出队满条件和相应的如对和出队算法。

    以域变量rear和length分别指示循环队列中队尾 元素的位置和内含元素的个数.给出队满条件和相应的如对和出队算法. /* 以域变量rear和length分别指示循环队列中队尾 元素的位置和内含元素 ...

  4. abcde依次进入一个队列_一个队列的入队序列为:abcde,则队列的出队序列是( )。

    [判断题]在具有头结点的单链表中,头指针指向单链表中第一个元素结点. [单选题]n个结点的线索二叉树上含有的线索数为( ) . [判断题]A 算法的时间复杂度为O(n),B算法的时间复杂度为O(2 n ...

  5. 简单实现顺序表示的栈与队列的进栈出栈创空栈入队出队创空队等算法

    栈和队列是两种最重要的数据结构,也是两种最典型的抽象数据类型,应用非常的广泛. 目录 一.栈 一.空栈的创建 二.进栈 三.出栈 二.队列 一.创建空队列 二.队列的入队和出队 三.取队列头元素 一. ...

  6. 用标志域tag判断队空队满的入队和出队算法

    题目: 若希望循环队列中的元素都能得到利用,则需设置一个标志域tag,并以tag的值为0或1来区分队头指针front和队尾指针rear相同时队列状态是空还是满.试编写与此结构相对应的入队和出队算法. ...

  7. 使用标志量消除循环链表“假溢出”的入队和出队算法

    问题:要求循环变量不损失一个空间全部都能利用,设置一个标志量tag,以tag为0或为1来区分头尾指针相同时的队列状态.请编写出此结构相应的入队与出队算法. 设标志位tag,初始化时将tag置为0,当入 ...

  8. 队列的入队/出队操作

    //............编程实现队列的入队/出队操作 (先进先出) #include<iostream> using namespace std; //node表示队列中每个节点元素 ...

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

    队列 的定义: 一种可以是实现"先进先出"的存储结构.数据的进出类似于排队购票.队只允许队尾一端(rear)添加,在另一端队头(front)删除.队有队头(front)和队尾(re ...

最新文章

  1. 软件测试中的冲突测试
  2. split分片主要源码解析
  3. idea出现 Error:(1, 16) java: 非法字符: '\u0a0d'
  4. 重温C++之“strcpy_s与strcpy的比较”
  5. Reids 批量删除有相同前缀的keys
  6. 去掉iframe的水平滚动条而保留垂直滚动条
  7. 架构师速成8.3-可用性之分库分表
  8. 超详细Gitlab Runner环境配置中文教程
  9. Django运算表达式与Q对象/F对象
  10. 在线php网站扫描,php实现在线端口扫描实例代码_PHP教程
  11. VMware Converter Standalone结合TrueImage 迁移HyperV虚机
  12. 一套很好的51单片机教程,云龙51单片机视频教程(王云)
  13. springBoot整合tkMybatis
  14. table trtd tbody
  15. 【VB.net】大地测量——白塞尔大地解算程序设计
  16. 将PPT文件转换为Word文档
  17. Oracle Linux 迷途知返
  18. 易创索讯-SEO网站优化获得销售的6种策略!
  19. 计算机制造技术飞速发展 使用计算机,机械设计制造及其自动化中计算机技术的应用分析...
  20. 教你如何将你的Qt项目打包安装在MeeGo系统中

热门文章

  1. A型钽电容和B型钽电容的区别?
  2. Skype打不开,双击没反应?(win7)
  3. Python matplotlib 柱状图 添加平均线
  4. SpotlessCity:第一个干洗服务网站 反映纽约人有多懒
  5. 基于Cplex的分支定界
  6. 计算机专业英语谐音读法,英语48个音标中文谐音读法大全
  7. config linux start up with only one app - firefox
  8. Redis Manager 2020.7 安装问题(RDM 2020.7)
  9. 基于Arduino开发板使用HC-12远程无线通信模块
  10. 高校舆情监控系统建设(TOOM)如何做好教育行业舆情监控方案?