线性结构:有且只有一个根节点,且每个节点最多有一个直接前驱和一个直接后继的非空数据结构

非线性结构:不满足线性结构的数据结构

队列

队列一般分为两类:链式队列和顺序队列

         链式队列---链式队列即用链表实现的队列

         顺序队列---顺序队列是用数组实现的队列,顺序队列通常必须是循环队列

1、基本概念:

  队列是指允许在一端进行插入,在另一端进行删除的线性表,又称“先进先出”的线性表

  队列是一种特殊的线性结构,它只允许在队列的首部(head)进行删除操作,这称为出队

  队尾:允许插入的一端,用尾指针指向队尾元素的后一位置

  队首:允许删除的一端,用头指针指向头元素

循环队列(顺序队列)的实现:

 #include <stdio.h>

 #define LENGTH 11    /*定义数组最大长度 */
#define OUT 1 /* 出队 */
#define GET 2 /* 入队 */
struct queue
{
int data[LENGTH];
int head; /* 队首 */
int tail; /* 队尾 */
};
/* 循环队列的实现 */
main()
{
struct queue q;
int i;
int kk = ;
/* 初始化队列 */
q.head = q.tail = ; /*队首队尾初始化 */
/* 依次插入10个数 */
for (i = ; i < LENGTH - ; i++)
{
scanf_s("%d", &q.data[q.tail]);
q.tail = (q.tail + ) % LENGTH;
}
while ()
{
if (q.head == q.tail)
{
printf("队列已空");
break;
}
printf("出队:1\n入队:2\n");
scanf_s("%d", &kk);
if (kk == OUT)
{ q.head = (q.head + ) % LENGTH;
}
else if (kk == GET)
{
if (q.head == (q.tail + ) % LENGTH)
{
printf("队列已满");
break;
}
printf("输入入队元素:\n");
scanf_s("%d", &q.data[q.tail]);
q.tail = (q.tail + ) % LENGTH;
} if (q.tail != q.head)
{
printf("队列中剩余元素:");
for (i = q.head; ;)
{
printf("%d ", q.data[i]);
i = (i + ) % LENGTH;
if(i == q.tail)
{
putchar('\n');
break;
}
}
}
} return ;
}

2、为什么顺序队列通常必须是循环队列

循环队列是针对顺序队列中最大内存空间有限的一种解决方法,当队列(数组)不可再插入新元素但队列的实际可用空间并未占满的问题的一种合理的解决方案

3、与普通顺序队列的区别

普通顺序队列在插入新元素(入队)时为q.tail++,删除旧元素(出队)时为q.head++(q.tail和q.head都为int型,但为了描述方便这里说成指针),在出队后再想插入新元素且此时q.tail在数组的末尾即最后一位就会出现实际可用空间并未占满但无法插入新元素的问题,强行插入会造成数组越界,也不宜继续扩大数组空间,造成了空间上的浪费

循环队列的核心在于队头指针和队尾指针的增加方式

q.head = (q.head + 1) % LENGTH;

q.tail = (q.tail + 1) % LENGTH;

这样实现了臆想上存储空间的弯曲效果,也解决了空间上的浪费(建议在纸上模拟循环队列数组的出队入队操作,以理解上面两行代码)

值得注意的是

q.head指向的是队首元素

q.tail指向的是队尾元素的后一位,浪费了一位空间,例如数组q.data[11]插入10个元素后q.tail指向的是q.data[10]即q.tail = 10;

4、循环队列的新问题

当队列为空时q.head = q.tail,当队列为满时也有q.head = q.tail造成了判断队列是空还是满的二义性

解决方法: 1.增加一个参数,使删除元素为1,插入元素为0

 2.增加一个参数,记录队列的元素个数即长度

  3.空出一个单元,令if(q.head == (q.tail + 1) % LENGTH)为队列为满的条件,以此解决二义性

5、注意

循环队列的头指针和尾指针的减少或增加方式

队列为满或空的判定条件

循环队列参考链接:

https://www.cnblogs.com/chenliyang/p/6554141.html                 该篇比较详细

https://blog.csdn.net/smile_zhangw/article/details/80894159

https://www.cnblogs.com/xiaoyouPrince/p/8125852.html

https://www.cnblogs.com/xing901022/p/3534937.html

(编译器:Microsoft Visual C++ 2010 Express)

队列(循环队列)----C语言的更多相关文章

  1. 用数组实现队列(顺序队列&循环队列)

    用数组实现队列(顺序队列&循环队列) 顺序队列 ️ 队列(先进先出) 几个问题: 队列方法:入队.出队 队列的存储:即队首队尾两个指针, 扩容:如果队列容量不够了,应该扩容,如果队尾没有位置了 ...

  2. Atitit.升级软件的稳定性---基于数据库实现持久化 循环队列 循环队列

    Atitit.升级软件的稳定性---基于数据库实现持久化  循环队列 环形队列 1. 前言::选型(马) 1 2. 实现java.util.queue接口 1 3. 当前指针的2个实现方式 1 1.1 ...

  3. Javascript数据结构与算法--队列(顺序队列、优先队列、循环队列)的实现与用法

    前言 队列和栈非常类似,前面已经讲过了栈的实现与用法,现在我们来说说队列. 队列介绍 队列遵循FIFO(First In First Out,先进先出)原则的一组有序的项. 队列是一种特殊的线性表,特 ...

  4. C# 数据结构基础-实现循环队列

    队列     队列的概念是先进先出,这个应该不用多说了.看下面那个从网上找的现成图片. 循环队列     循环队列在逻辑上将队列中的数据摆成环形,如下图: 下面直接上代码. 队列 队列的概念是先进先出 ...

  5. TypeScript算法与数据结构-队列和循环队列

    本文涉及的源码,均在我的github.有两部分队列和循环队列.有问题的可以提个issue,看到后第一时间回复 1. 队列(Queue) 队列也是一种线性的数据结构, 队列是一种先进先出的数据结构.类似 ...

  6. 数据结构-循环队列(Python实现)

    今天我们来到了循环队列这一节,之前的文章中,我介绍过了用python自带的列表来实现队列,这是最简单的实现方法. 但是,我们都知道,在列表中删除第一个元素和删除最后一个元素花费的时间代价是不一样的,删 ...

  7. Java数据结构——循环队列

    普通顺序队列存在的问题在普通顺序队列中,入队的操作就是先将尾指针rear右移一个单位,然后将元素值赋值给rear单位.出队时,则是头指针front后移一个单位.像这样进行了一定数量的入队和出队操作后, ...

  8. 数据结构算法C语言实现(十二)--- 3.4循环队列&队列的顺序表示和实现

    一.简述 空队列的处理方法:1.另设一个标志位以区别队列是空还是满:2.少用一个元素空间,约定以队列头指针在队尾指针下一位置上作为队列呈满的状态的标志. 二.头文件 //3_4_part1.h /** ...

  9. C语言数据结构-循环队列的实现-初始化、销毁、清空、长度、队列头元素、插入、删除、显示操作

    1.数据结构-循环队列的实现-C语言 #define MAXSIZE 100 //循环队列的存储结构 typedef struct { int* base; //基地址 int _front; //头 ...

随机推荐

  1. xtrabackup拷贝redolog前做的细节操作

    原文地址:http://www.innomysql.net/article/25590.html 前言 淘宝3月的数据库内核月报对 xtrabackup的备份原理 做了深入的分析,写的还是很不错.不过 ...

  2. c++ tricks

    1 关于virtual关键字的实验 1.1 在派生类中改变virtual函数访问权限 定义两个类A,B,其中B公有派生于A.A中定义一个private成员虚函数func,B中覆写此函数,但是将其访问权 ...

  3. 2018.07.22哨戒炮 II(树形dp)

    哨戒炮 II 描述 你的防线成功升级,从原来的一根线变成了一棵树.这棵树有 N 个炮台,炮台与炮台之间 有 N-1 条隧道.你要选择一些炮台安装哨戒炮.在第 i 个炮台上安装哨戒炮得到的防御力为 vi ...

  4. derective示例

    1.指令的定义 .directive('haproxySetting', [ function () { return { restrict: 'AEC', scope: { haproxy: '=' ...

  5. bootstrap-treeview的 简单使用

    理论:http://blog.csdn.net/babyxue/article/details/73835444 插依赖Bootstrap 和jQuery <link href="~/ ...

  6. Spring Boot的自动配置的原理浅析

    一.原理描述 Spring Boot在进行SpringApplication对象实例化时会加载META-INF/spring.factories文件,将该配置文件中的配置载入到Spring容器. 二. ...

  7. Vue 需要使用jsonp解决跨域时,可以使用(vue-jsonp)

    1,执行命令 npm install vue-jsonp --save 2.src/main.js中添加: import VueJsonp from 'vue-jsonp' Vue.use(VueJs ...

  8. SecureCRT和乱码

    示例: # ls /usr/local/r3c/bin/lib /bin/ls: /usr/local/r3c/bin/lib: ????????? 查看系统字符集设置: # locale LANG= ...

  9. TurtleBot教程

    TurtleBot TurtleBot combines popular off-the-shelf robot components like the iRobot Create, Yujin Ro ...

  10. HDU1459 非常可乐(BFS) 2016-07-24 15:00 165人阅读 评论(0) 收藏

    非常可乐 Problem Description 大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为.因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶 ...