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

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

队列

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

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

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

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. Java ENUM枚举的用法

    DK1.5引入了新的类型——枚举.在 Java 中它虽然算个“小”功能,却给我的开发带来了“大”方便. 用法一:常量 在JDK1.5 之前,我们定义常量都是: publicstaticfianl... ...

  2. Restful API设计要点

    1 Restful API时面向资源,不能面向动作: 2 充分利用http协议的GET, HEAD, OPTION, PUT, POST, DELETE几种方法: 3 GET方法用于获取资源,是幂等和 ...

  3. PS想象的力量无限大,设计师的脑洞无限大!

    我(nemanjasekulic)一直对魔法与科幻感兴趣,但是,现实中,它们并不存在.我所做的是尽量体现一切都是可能的,表达一种没有约束的理想概念. 编辑:千锋UI设计

  4. HBase Filter程序样例及Shell(图)

    ==过滤器执行流程== reset() : reset the filter state before filtering a new row. filterAllRemaining(): true ...

  5. android的 Base64

    byte[] key=Base64.decode("YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4".getBytes(), Base64.DEFAULT);   ...

  6. win8 app code中设置Resources里定义好的Style

    WPF中应该可以用这个: rectangle.Style = (Style)FindResource("FormLabelStyle"); 但 Win8.1 App是个精简框架,F ...

  7. 2018.09.25 bzoj3572: [Hnoi2014]世界树(虚树+树形dp)

    传送门 虚树入门题? 好难啊. 在学习别人的写法之后终于过了. 这道题dp方程很好想. 主要是不好写. 简要说说思路吧. 显然最优值只能够从子树和父亲转移过来. 于是我们先dfs一遍用儿子更新父亲,然 ...

  8. 微信小程序 发送模版消息

    微信小程序开发之发送模板消息 1,小程序wxml页面form表单添加 report-submit="true" <form bindsubmit="sub" ...

  9. arduino 中通过寄存器地址访问寄存器内容

    void call_func( void (*func)(void)){ (*func)(); } void setup() { // put your setup code here, to run ...

  10. HDU 1197 Specialized Four-Digit Numbers (枚举+进制转化,简单)

    题意:让求从2992-9999中所有数字,满足10进制各位之和和12进制和16进制各位数字之和相等. 析:没啥可说的,只能枚举从2992-9999,每个进制都算一下. 代码如下: #include & ...