C语言如何写循环队列,C语言 队列(循环队列)
C语言 队列(循环队列)
线性结构:有且只有一个根节点,且每个节点最多有一个直接前驱和一个直接后继的非空数据结构
非线性结构:不满足线性结构的数据结构
队列
队列一般分为两类:链式队列和顺序队列
链式队列---链式队列即用链表实现的队列
顺序队列---顺序队列是用数组实现的队列,顺序队列通常必须是循环队列
1、基本概念:
队列是指允许在一端进行插入,在另一端进行删除的线性表,又称“先进先出”的线性表
队列是一种特殊的线性结构,它只允许在队列的首部(head)进行删除操作,这称为出队
队尾:允许插入的一端,用尾指针指向队尾元素的后一位置
队首:允许删除的一端,用头指针指向头元素
循环队列(顺序队列)的实现:
#include
#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 = 0;
/* 初始化队列 */
q.head = q.tail = 0; /*队首队尾初始化 */
/* 依次插入10个数 */
for (i = 0; i < LENGTH - 1; i++)
{
scanf_s("%d", &q.data[q.tail]);
q.tail = (q.tail + 1) % LENGTH;
}
while (1)
{
if (q.head == q.tail)
{
printf("队列已空");
break;
}
printf("出队:1\n入队:2\n");
scanf_s("%d", &kk);
if (kk == OUT)
{
q.head = (q.head + 1) % LENGTH;
}
else if (kk == GET)
{
if (q.head == (q.tail + 1) % LENGTH)
{
printf("队列已满");
break;
}
printf("输入入队元素:\n");
scanf_s("%d", &q.data[q.tail]);
q.tail = (q.tail + 1) % LENGTH;
}
if (q.tail != q.head)
{
printf("队列中剩余元素:");
for (i = q.head; ;)
{
printf("%d ", q.data[i]);
i = (i + 1) % LENGTH;
if(i == q.tail)
{
putchar('\n');
break;
}
}
}
}
68
return 0;
}
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、注意
循环队列的头指针和尾指针的减少或增加方式
队列为满或空的判定条件
linuxboy的RSS地址:https://www.linuxboy.net/rssFeed.aspx
本文永久更新链接地址:https://www.linuxboy.net/Linux/2019-08/159767.htm
C语言如何写循环队列,C语言 队列(循环队列)相关推荐
- C语言答案写成科学记数法,c语言科学记数法_C语言中、科学计数法123456e+002具体代表什么意思、或者说怎么理解这个数_淘题吧...
『壹』 c语言用double写了一个表示科学计数法的程序,但是却读不出来30位以上的数,怎么办 double 是抄64 位(8字节),52 位代表有袭效数位,11 位表示指数,一位表示符号,精度(有效 ...
- 99用c语言怎么写出来的,c语言的书写格式是什么
符号名包括模块名.常量名.标号名.子程序名等.这些名字应该能反映它所代表的实际东西,具有一定的意义,使其能够见名知义,有助于对程序功能的理解.命名采用匈牙利命名法.具体规则如下: (1)所有宏定义.枚 ...
- python跟易语言那个写辅助_易语言写练练看辅助
.版本 2 .支持库 BmpOperate .支持库 shellEx .支持库 dp1 .程序集 窗口程序集1 .程序集变量 方块数据, 方块数据, , "19,11" .程序集变 ...
- c语言怎么写星星代码,C语言打印星星的问题
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include int main(void) { int index, up, lines; printf("请输入将要显示 ...
- c语言怎样写积分程序,C语言实现定积分求解方法
求定积分的方法有很多种,下面是我总结的几种比较常用的方法. #include #include #include #include #define N3 double fun(double x) { ...
- C语言(一):C语言概述介绍
目录 1.1 什么是C语言 1.2 计算机介绍 1.2.1 计算机结构组成 1.2.2 计算机系统组成 1.2.3 程序和指令 1.3 语言发展历程 1.3.1 机器语言 1.3.2 汇编语言和编译器 ...
- 中南大学c语言试题期末考试,中南大学c语言考试-中南大学c语言用什么教材
中南大学c++考试是怎样安排的.为什么在教务管理系统就少了这一科目.本人在该教学班没有同学无法求证 找到老师电话,打电话问他,教务管理系统只会有大型统考的考试安排,我们院考c语言是,也是班长通知的,还 ...
- LeetCode622循环队列C语言实现
LeetCode622循环队列C语言实现 c语言一般是10表示true false,所以有一点点不习惯. 这道题需要注意的点.开始的时候front=1,back=0. 这样enqueue和dequeu ...
- 循环队列–C语言实现–数据结构
循环队列–C语言实现–数据结构 目录 循环队列C语言实现数据结构 目录 一 要求 二 循环队列 三 循环队列的算法设计 1 建立循环队列 2 置空队列 3 入队 4 出队 5 打印队 四 程序 1 程 ...
- C语言查看队头元素,C语言实现循环队列的初始化进队出队读取队头元素判空-1...
目前,处在学习数据结构+ing,由于之前学过了队列,今天就把自己写过的代码做了一些完善分享给大家,希望能够帮助到有需要的朋友,有不足的地方欢迎大家交流 φ(゜▽゜*)♪ 队列是另一种限定性的线性 ...
最新文章
- gz键盘增强小工具_这些不起眼的Mac小工具,能让你的Macbook效率倍增!
- 微信小程序swiper图片尺寸_微信小程序之swiper轮播图中的图片自适应高度的方法...
- 第10章 springboot是什么
- 《Python Cookbook 3rd》笔记(4.5):反向迭代
- php 检测编码函数,自己写了一个php检测文件编码的函数
- mongodb更新操作符
- 股票撤销st申请多长时间批复?
- 2fsk调制解调原理框图_数字调制解调输出什么 数字调制解调输出特点介绍【图文】...
- 价值连城 图灵奖得主Yann LeCun 杨立昆的采访 给AI从业者的建议
- Java是什么?Java到底能干嘛?
- 用 GNS3 做CCNA网络实验(4)
- 什么是数据湖?为什么需要数据湖?
- python迭代器定义_Python-迭代器相关概念
- javaScript实现通过鼠标滑轮改变元素大小
- Linux下gcc/g++中-I(i的大写)、-L和-l
- 打印JVM所有参数列表的方法 -XX:PrintFlagsFinal、–XX:PrintCommandLineFlags
- iOS 最新版9.3 disk image
- 可汗学院金融学笔记系列
- 如何提高百度经验推广技巧
- Oracle内存结构:SGA PGA UGA